XStream
一、概述
XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象。
也就是说,使用XStream,我们可以把Java对象转换成XML,也可以将XML转换为Java对象。
二、XStream相关jar包
XStream的必导JAR包:
- 核心JAR包:
xstream-1.4.7.jar; - 必须依赖包:
xpp3_min-1.1.4c.jar(XML Pull Parser,一款速度很快的XML解析器)。
三、创建两个类
package com.veeja.demo; public class City {
private String name;// 市名 private String description;// 描述 public String getName() {
return name; } public void setName(String name) {
this.name = name; } public String getDescription() {
return description; } public void setDescription(String description) {
this.description = description; } public String toString() {
return "City [name=" + name + ", description=" + description + "]"; } public City() {
super(); // TODO Auto-generated constructor stub } public City(String name, String description) {
super(); this.name = name; this.description = description; } }
另一个是Province类:
package com.veeja.demo; import java.util.ArrayList; import java.util.List; public class Province {
private String name;// 省名 private List<City> cities = new ArrayList<City>(); public String getName() {
return name; } public void setName(String name) {
this.name = name; } public List<City> getCities() {
return cities; } public void setCities(List<City> cities) {
this.cities = cities; } public void addCity(City city) {
cities.add(city); } }
四、简单的示例
使用XStream,步骤也很简单。
第一步就是创建XStream对象。
XStream xStream = new XStream();
然后就是使用toXML方法来转换成xml格式的字符串。
String string = xStream.toXML(proList);
@Test public void function1() {
List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); String string = xStream.toXML(proList); System.out.println(string); } public List<Province> getProvinceList() {
Province p1 = new Province(); p1.setName("北京"); p1.addCity(new City("东城区", "dongchengqu")); p1.addCity(new City("昌平区", "changpingqu")); Province p2 = new Province(); p1.setName("山东省"); p1.addCity(new City("济南", "jinan")); p1.addCity(new City("青岛", "qingdao")); ArrayList<Province> provinceList = new ArrayList<Province>(); provinceList.add(p1); provinceList.add(p2); return provinceList; }
结果:
北京
东城区
dongchengqu
昌平区
changpingqu
山东省
济南
jinan
青岛
qingdao
我们可以观察一下这个结果:
- 我们可以明显的看出来,这是一个XML格式的文本。
- 根元素是
, 因为我们是把List对象转换为xml,所以根元素为。 - 第二级为
,因为我们Javabean的类型为Province,所以元素的名称就是类的完整名
- 第三级为
和
,就是Province类内的属性名。
- 。。。
- 。。。
五、别名
我们在上面生成的xml中,发现了几个问题:
- 根元素是
,根据我们的需求,其实这个根元素如果是更合适一点。
- 还有中间的
,都太长了,而且还有类的包名,这里可以简要一些,换成小写,也就是
就可以了。
这个问题怎么解决呢?答案是使用“别名(alias)”。
我们有这么几个需求:
默认List类型对应 元素,希望让List类型对应元素;
默认Province类型对应,希望让它对应
;
默认City类型对应,希望它对应
元素。
我们可以使用xstream.alias("aaa",Bbb.class);用来将Bbb类指定别名为aaa。
例如,我们改写上面的代码为:
@Test public void function2() {
List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); String string = xStream.toXML(proList); System.out.println(string); }
我们再看一下结果,已经变成我们想要的样子了:
北京
东城区
dongchengqu
昌平区
changpingqu
山东省
济南
jinan
青岛
qingdao
六、指定属性、去除无用Collection类的属性
我们现在不妨把山东省的那一部分单独拿出来看一看:
<province> <name>山东省
name> <cities> <city> <name>济南
name> <description>jinan
description>
city> <city> <name>青岛
name> <description>qingdao
description>
city>
cities>
province>
<province name="山东省"> <city> <name>济南
name> <description>jinan
description>
city> <city> <name>青岛
name> <description>qingdao
description>
city>
province>
这样就会简洁的多。
也就是说,默认情况下,Javabean的属性都会生成子元素,但是我们希望生成为元素的属性。
这时我们可以使用xstream.useAttributeFor(Ccc.class, "name");来将Ccc类的name属性,生成的属性。
我们还可以使用xStream.addImplicitCollection(Province.class, "cities");来去除Province类的cities(Collection类型的)属性。
也就是我们再次改写上面的代码:
@Test public void function2() {
List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); xStream.useAttributeFor(Province.class, "name"); xStream.addImplicitCollection(Province.class, "cities"); String string = xStream.toXML(proList); System.out.println(string); }
我们看一下输出的结果:
东城区
dongchengqu
昌平区
changpingqu
济南
jinan
青岛
qingdao
七、去除不想要的Javabean属性
我们又发现了一个问题,这个属性好像没什么用处。这个属性能不能去掉呢?
这个时候,我们可以使用xStream.omitField(City.class, "description");来去除。
改写代码:
@Test public void function2() {
List<Province> proList = getProvinceList(); /* * 创建XStream对象,调用toXML把集合转换成xml字符串 */ XStream xStream = new XStream(); xStream.alias("china", List.class); xStream.alias("province", Province.class); xStream.alias("city", City.class); xStream.useAttributeFor(Province.class, "name"); xStream.addImplicitCollection(Province.class, "cities"); // 让city类,名为description的属性不生成对应的xml属性 xStream.omitField(City.class, "description"); String string = xStream.toXML(proList); System.out.println(string); }
输出结果:
东城区
昌平区
济南
青岛
END.
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210858.html原文链接:https://javaforall.net
