XStream是一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和xml文档相互转换)。
引入依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.13</version>
</dependency>
注解
@XStreamAsAttribute注解可以使定义对象的属性映射为xml文件的属性。
@XStreamAlias标注别名,当属性名和xml元素名不同时使用,一样时可以不写。
方法
xstream.fromXML(xml);可以将xml字符串转化为对象;
xstream.toXML(person); 方法可以将Java对象转为xml字符串。
xml报文格式
<BODY>
<JSL>1</JSL>
<LIST>
<Record index="1">
<NAME>张三</NAME>
<NUMBER>001</NUMBER>
</Record>
</LIST>
</BODY>
配置映射对象
@Data
@XStreamAlias("BODY")
public class Body implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias("JLS")
private Integer jsl;
@XStreamAlias("LIST")
private List<Profit> list = new ArrayList<>();
}
@Data
@XStreamAlias("Record")
public class Profit {
@XStreamAsAttribute
@XStreamAlias("index")
private String index;
@XStreamAlias("NAME")
private String name;
@XStreamAlias("NUMBER")
private String number;
}
为了方便统一配置XStream转换,可以封装个工具类,传入类的class和xml字符串,返回对象。
工具类
public class XStreamUtil {
public static Object toBean(Class<?> clazz, String xml) {
//设置驱动
XStream xstream = new XStream(new StaxDriver());
//对指定的类使用Annotations 进行序列化,这步非常关键
xstream.processAnnotations(clazz);
//忽略xml报文中不存在的元素,当xml报文中元素不确定时,如果类属性里存在xml报文里没有的属性,会报错
xstream.ignoreUnknownElements();
xstream.allowTypesByRegExp(new String[] { ".*" });
Object xmlObject= xstream.fromXML(xml);
return xmlObject;
}
}
工具类使用
Body body = (Body) XStreamUtil.toBean(Body.class, xmlContent)