XStream入门Demo
依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
<!--与spring整合的话要用到的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
准备工作
一个需要转换的实体类,拿大家最喜欢的Student类,嘻嘻。
public class Student {
private String name;
private Integer age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
例子:实体类转换成XML格式
场景1
代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");
XStream xStream = new XStream();
String result = xStream.toXML(student);
System.out.println(result);
结果
<Student>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
</Student>
场景2
我们发现根标签是这个类的名称,其实如果这个类是有在哪个包下的话 也就是有import package 这种东西的话
其实根标签会出现全路径名,但是这样太固定了,我们可能想自定义根路径。所以我们可以变成以下代码。
代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");
XStream xStream = new XStream();
//设置跟路径别名
xStream.alias("xml",Student.class);
String result = xStream.toXML(student);
System.out.println(result);
结果
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
</xml>
场景3
既然根标签可以修改,那里面的标签是不是也可以修改呢?答案是可以的。 因为我们可能有这样的需求,起码楼主在微信支付中见过此需求。因为我们平时实体类在定义属性的时候是不习惯把一个属性名字带有下划线,如mchId 很少人在定义的时候会写成mch_id。但是输出的时候我们又得是<mch_id>[!DATA]</mch_id>类似这样的。所以这时候我们得用XStream中的一个注解 @XStreamAlias(“别名”),本人感觉很好用。在刚才的Student类中属性的头上加一个这样的注解。
public class Student {
private String name;
private Integer age;
private String address;
@XStreamAlias("mch_id")
private String mchId;
}
代码
Student student = new Student();
student.setName("张三");
student.setAge(10);
student.setAddress("北京市东城区");
student.setMchId("110010");
XStream xStream = new XStream();
xStream.alias("xml",Student.class);
String result = xStream.toXML(student);
System.out.println(result);
结果
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
<mchId>110010</mchId>
</xml>
从结果中可以看出答案并不是我们想要的那样。注解压根没起作用啊,原来要让注解起作用,我们还得加一行代码才可以。
//扫描注解
xStream.autodetectAnnotations(true);
结果
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
<mch__id>110010</mch__id>
</xml>
但是又有问题!我想要mch_id 一个下划线 但是结果好像是mch__id 两个下划线。这里我们得需要一个驱动器可以解决这个问题,大家可以直接拿来用。
XStream parseXStream = new XStream(new Xpp3Driver(new NoNameCoder()));
结果
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
<mch_id>110010</mch_id>
</xml>
这次终于是我们想要的了。
例子:XML格式转成实体类
场景1
XML
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
</xml>
将上面的XML映射到Student类中
String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Security framework of XStream not initialized, XStream is probably vulnerable.
com.thoughtworks.xstream.mapper.CannotResolveClassException: xml
这是因为XStream解析不了根标签与Student之间的关系。所以我们得告诉它。所以要在类上添加刚才说的那个注解 @XStreamAlias
@XStreamAlias("xml")
public class Student {
}
String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
//别名xml
xStream.alias("xml",Student.class);
//开启注解扫描
xStream.autodetectAnnotations(true);
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Student(name=张三, age=10, address=北京市东城区, mchId=null)
同理,属性的别名也是按照的套路添加别名设置即可。
场景2
还有一个需求场景我也测试过。就是我们有时候不能保证实体类的属性值刚好跟XML的内容是对应的,这时候我们得靠一个方法设置一下即可解决。
<xml>
<name>张三</name>
<age>10</age>
<address>北京市东城区</address>
<mch_id>110010</mch_id>
<code>1</code>
</xml>
代码
String xml = "<xml><name>张三</name><age>10</age><address>北京市东城区</address><mch_id>110010</mch_id><code>11</code></xml>";
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
xStream.alias("xml",Student.class);
xStream.autodetectAnnotations(true);
Student student= (Student) xStream.fromXML(xml);
System.out.println(student);
结果
Security framework of XStream not initialized, XStream is probably vulnerable.
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$UnknownFieldException: No such field Student.code
这样就会出现未知字段的异常,这时候只需要添加一个方法即可。
xStream.ignoreUnknownElements();
这是我刚使用心得,后面SpringMVC整合XStream的我会再写一篇,希望还是有帮助到刚使用的小伙伴们。