xstream&json使用详解

本文详细介绍XStream工具用于JavaBean与XML之间的序列化过程,包括配置与使用细节,如别名设置、属性转换及去重等。同时,对比XML与JSON数据交换格式,讲解JSON在JS中的应用,并演示如何通过Apache提供的工具将JavaBean转换为JSON对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XStream:工具:

1: 能够将javabean 序列化问xml 文件:
2: 导入jar包:
xstram-jar: 核心jar包:
强依赖:xpp3-min.jar:xml的解析器:

3: 使用步骤:
获得对象:
XStream xstream = new XStream();
String xml = xstream.toXML(javaBean);

4: 代码实现: 如何将javaBean转换成xml文件:
(1)导入jar包:
(2)准备javaBean对象;
(3)获得XStream对象:
(4)调用方法: 转换成xml。 文件。

5:XStream的使用细节:
a:别名的使用:
xstream.alias(“china”, List.class); 将List 类型转换成china标签:
xstream.alias(“province”, Province.class);将Province实体类转换成province标签:

b:让实体类当中的属性不单独的生成一个标签, 而是生成元素的一个属性。
xstream.useAttributeFor(Province.class, “name”);
解析: 将Province类当中name属性在生成元素的时候, 将name作为一个province的属性存在。

c:去重Collection类型的无用的标签。
xstream.addImplicitCollection(Province.class, “cities”);
解析: 在生成元素的时候, 让Province的cities属性不单独的生成一个元素。

d:实体的某个属性不生成到xml当中:
xstream.omitField(City.class, “description”);
City当中的description不生成元素。
代码如下:

package com.yidongxueyuan.domain;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.thoughtworks.xstream.XStream;

public class TestXStream {
	
	//准备数据: 
	public List<Province> getProvince(){
		List<Province> list = new ArrayList<Province>();
		
		
		//准备省: 
		Province pro= new Province(); 
		pro.setName("山东");
		pro.getCities().add(new City("青岛市","美丽的滨海城市"));
		pro.getCities().add(new City("济南市","这是一个美丽的大泉城"));
		
		Province pro2= new Province(); 
		pro2.setName("河北省");
		pro2.getCities().add(new City("廊坊市","这是一个很好的大都市"));
		pro2.getCities().add(new City("石家庄","这是河北的省会"));
		
		//将省装进list集合当中: 
		list.add(pro);
		list.add(pro2);
		return list; 
	} 

/*
 <list>   ---->解析的是一个list集合: list集合做了跟标签: set : 
  <com.yidongxueyuan.domain.Province> ----->list集合当中的实体, 生成了一个标签:  实体的全路径名称承当标签: 
    <name>山东</name>  name: province 实体的属性: 
    <cities>  cities: 也是province 实体的属性: 
      <com.yidongxueyuan.domain.City>  ---->City:这是集合当中实体的类型: 
        <name>青岛市</name>  ---->City:实体的属性: 
        <description>美丽的滨海城市</description> City:实体的属性: 
      </com.yidongxueyuan.domain.City>
      <com.yidongxueyuan.domain.City>
        <name>济南市</name>
        <description>这是一个美丽的大泉城</description>
      </com.yidongxueyuan.domain.City>
    </cities>
  </com.yidongxueyuan.domain.Province>
  <com.yidongxueyuan.domain.Province>
    <name>河北省</name>
    <cities>
      <com.yidongxueyuan.domain.City>
        <name>廊坊市</name>
        <description>这是一个很好的大都市</description>
      </com.yidongxueyuan.domain.City>
      <com.yidongxueyuan.domain.City>
        <name>石家庄</name>
        <description>这是河北的省会</description>
      </com.yidongxueyuan.domain.City>
    </cities>
  </com.yidongxueyuan.domain.Province>
</list>

 */
	
	@Test
	public void testXStream1() throws Exception {
		List<Province> provinces = getProvince();
		
		//创建XStream对象: 
		XStream xstream = new XStream();
		String xml = xstream.toXML(provinces);
		System.out.println(xml);
	}
	
	/*
	 * 1:生成的xml  并不是我们理想型: 
	 * 希望: list 集合: ---->china  
	 *     <com.yidongxueyuan.domain.Province>---<province> 
	 *     
	 *  此时就需要使用xstream当中的别名: 
	 *    
	 */
	
	//使用别名替换后的结果:
	/*
<china>
  <province>
    <name> 山东 </name>
    <cities>
      <city >
        <name>青岛市</name>
        <description>美丽的滨海城市</description>
      </city>
      <city>
        <name>济南市</name>
        <description>这是一个美丽的大泉城</description>
      </city>
    </cities>
  </province>
  <province>
    <name>河北省</name>
    <cities>
      <city>
        <name>廊坊市</name>
        <description>这是一个很好的大都市</description>
      </city>
      <city>
        <name>石家庄</name>
        <description>这是河北的省会</description>
      </city>
    </cities>
  </province>
</china>
	 */
	
	@Test
	public void testXStream2() throws Exception {
		List<Province> provinces = getProvince();
		XStream xstream = new XStream();
		/*
		 * 使用别名: 
		 *  xstream.alias()
		 */
		xstream.alias("china", List.class);// class类型:  
		xstream.alias("province", Province.class);
		xstream.alias("city", City.class);
		String xml = xstream.toXML(provinces);
		System.out.println(xml);
	}
	
	/*
	 * 希望: name 这个标签当中的内容,设置成 province的属性: 
	 * <province> 
	 *     <name> 山东 </name> 
	 * </province>
	 * 
	 * 转换成: 如下格式: 
	 * <province name="山东"/>
	 * <city name="xx"/> 
	 */
	
	//准换后的结果: 
/*	<china>
	  <province name="山东">
	    <cities> ---
	      <city name="青岛市">
	        <description>美丽的滨海城市</description>
	      </city>
	      <city name="济南市">
	        <description>这是一个美丽的大泉城</description>
	      </city>
	    </cities>
	  </province>
	  <province name="河北省">
	    <cities>
	      <city name="廊坊市">
	        <description>这是一个很好的大都市</description>
	      </city>
	      <city name="石家庄">
	        <description>这是河北的省会</description>
	      </city>
	    </cities>
	  </province>
	</china>*/

	@Test
	public void testXStream3() throws Exception {
		List<Province> provinces = getProvince();
		XStream xstream = new XStream();
		xstream.alias("china", List.class);// class类型:  
		xstream.alias("province", Province.class);
		xstream.alias("city", City.class);
		
		/*
		 * 将实体的属性转换成  标签的属性: 不让其生成一个单独的标签: ..
		 * xstream.
		 */
		xstream.useAttributeFor(Province.class, "name"); 
		xstream.useAttributeFor(City.class, "name"); 
		String xml = xstream.toXML(provinces);
		System.out.println(xml);
	}
	
	/*
	  <province name="山东">
	    <cities> ---
	      <city name="青岛市">
	        <description>美丽的滨海城市</description>
	      </city>
	      <city name="济南市">
	        <description>这是一个美丽的大泉城</description>
	      </city>
	    </cities>
	  </province>
	  分析: cities 标签是province 的一个属性标签: 这个属性标签, 没实质型的作用:  不要让其生成: 
	 cities 属性:是一个list 集合类型: 在生产元素的时候, 只需要生成集合当中的实体。 list 这个类型没有必要在生成一个单独的标签。, 
	 
	 */
	
	//生成的结果:
/*	<china>
	  <province name="山东">
	    <city name="青岛市">
	      <description>美丽的滨海城市</description>
	    </city>
	    <city name="济南市">
	      <description>这是一个美丽的大泉城</description>
	    </city>
	  </province>
	  <province name="河北省">
	    <city name="廊坊市">
	      <description>这是一个很好的大都市</description>
	    </city>
	    <city name="石家庄">
	      <description>这是河北的省会</description>
	    </city>
	  </province>
	</china>*/

	@Test
	public void testXStream4() throws Exception {
		List<Province> provinces = getProvince();
		XStream xstream = new XStream();
		xstream.alias("china", List.class);// class类型:  
		xstream.alias("province", Province.class);
		xstream.alias("city", City.class);
		xstream.useAttributeFor(Province.class, "name"); 
		xstream.useAttributeFor(City.class, "name");
		
		/*
		 * list集合的类型没有必要生成,只生成list集合当中的存放的实体:
		 * addImplicitCollection(Class, "fieldName")
		 */
		xstream.addImplicitCollection(Province.class, "cities");
		String xml = xstream.toXML(provinces);
		System.out.println(xml);
	}
	
	
	/*
	 *  <city name="石家庄">
	      <description>这是河北的省会</description>
	    </city>
	    分析: city当中的标签 description这个标签, 不想让其生成到xml当中: 
	 */
	/*
 <china>
  <province name="山东">
    <city name="青岛市"/>
    <city name="济南市"/>
  </province>
  <province name="河北省">
    <city name="廊坊市"/>
    <city name="石家庄"/>
  </province>
</china>

	 */
	@Test
	public void testXStream5() throws Exception {
		List<Province> provinces = getProvince();
		XStream xstream = new XStream();
		xstream.alias("china", List.class);// class类型:  
		xstream.alias("province", Province.class);
		xstream.alias("city", City.class);
		xstream.useAttributeFor(Province.class, "name"); 
		xstream.useAttributeFor(City.class, "name");
		xstream.addImplicitCollection(Province.class, "cities");
		/*
		 * 不想生成到xml当中: 
		 * omitField(Class,field);
		 */
		xstream.omitField(City.class, "description");
		String xml = xstream.toXML(provinces);
		System.out.println(xml);
	}
}

JSON的使用:

1: json 数据交换格式:js当中的:

2:数据传输:
XML: 这是一种重量级别的数据交换格式:
json: 这是一个轻量级别的数据交换格式:

3: js当中定义一个json对象:
//js当中创建了一个json对象:
var person = {“username”:“binbin”,“age”:78,“gender”:“nan”};

var value = person.属性名称; //获得了属性名称对应的属性值:

细节: 创建的{}对象必须使用{}引起来。
{}当中分为属性名称和属性值: 属性的名称必须使用双引号引起来。
属性值:属性可以是
字符串类型:
数值类型:
布尔类型:
数组:
null

//复杂的json对象:             
 var value= {"username":"lisi","address": [
   {
      address:[{},{},{}]
   },{
   
   },{
   
   }
   
 ]}

下面的例子演示客户端发送ajax请求,服务器端接收。
JSP代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'json1.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   <script>
   	  /*   var person ={"username":"binchen","age":29,"gender":"nan"};
   	    alert(person.username); */
   	    
   	    //定义了一个字符串: 
   	    var str ="{\"username\":\"binchen\",\"age\":29,\"gender\":\"nan\"}";
   	    
   	    //函数: eval();模拟了浏览器的引擎。  能够解析js代码: 
   	    var person = eval("("+ str +")");// str 解析成一个json对象: 
   	    alert(person.username);
   	    
   	   // var str1="ab\"c"; 
   </script>
  </body>
</html>

服务端代码:

package com.yidongxueyuan.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		   //给客户端响应了一个json串: 
		  String str ="{\"username\":\"binchen\",\"age\":29,\"gender\":\"nan\"}";
		  response.getWriter().println(str);
		  
		  
		  
	}

}

将 javaBean转换成json 对象:

工具: Apache组织提供:
使用步骤:
(1)导入jar包:
核心jar包:
依赖jar包: xxx

(2)核心类:
JSONObject: map集合:
JSONArray: list集合:
解析:
核心类: 作为map集合或者是list集合使用的比较少: 应用比较广泛的是, 将准备好的javaBean转换成json对象:
代码如下:

package com.yidongxueyuan.domain;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.junit.Test;

public class TestJson {
	@Test
	public void test1() throws Exception {
		//作为一个map集合使用: 
		JSONObject json = new JSONObject(); 
		
		json.put("username", "lisi");
		json.put("age", "21");
		json.put("gender", "nan");
		
		System.out.println(json.toString());//[输出为:{"name":"zhangSan","age":"18","sex":"male"}]
		
		//创建一个Person对象: 
		Person p= new Person("wangwu","nan","21");
		JSONObject json2 = JSONObject.fromObject(p);
		System.out.println(json2);
		// {"age":"21","gender":"nan","username":"wangwu"}// json 
		
		
		JSONArray list = new JSONArray();//能够list集合使用: 
		
		Person p3= new Person("wangwu","nan","21");
		list.add(p3);//作为list集合使用: p装进list集合当中: 
		System.out.println(list);// [{"age":"21","gender":"nan","username":"wangwu"}]
		
		
		//转换javaBean : 广泛应用: 
		JSONArray json3 = JSONArray.fromObject(p3);
		System.out.println(json3);

		//发送到前段解析:  
		
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值