pom依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.19</version>
</dependency>
普通实体类
public class Person {
private int id;
private String name;
private int age;
private List<String> hobbies;
private List<Person> family;
public Person(int id, String name, int age, List<String> hobbies, List<Person> family) {
this.id = id;
this.name = name;
this.age = age;
this.hobbies = hobbies;
this.family = family;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", family=" + family
+ "]";
}
}
List<String> hobbies = new ArrayList<>();
hobbies.add("play");
hobbies.add("learn");
List<Person> list = new ArrayList<>();
Person brother = new Person(1, "哥哥", 22, hobbies, null);
Person sister = new Person(2, "妹妹", 17, null, null);
list.add(brother);
list.add(sister);
Person p = new Person(3, "小明", 20, hobbies, list);
XStream xs = new XStream();
String xml = xs.toXML(palias);
System.out.println(xml);
打印结果
<com.demo.test.Person>
<id>3</id>
<name>小明</name>
<age>20</age>
<hobbies>
<string>play</string>
<string>learn</string>
</hobbies>
<family>
<com.demo.test.Person>
<id>1</id>
<name>哥哥</name>
<age>22</age>
<hobbies reference="../../../hobbies"/>
</com.demo.test.Person>
<com.demo.test.Person>
<id>2</id>
<name>妹妹</name>
<age>17</age>
</com.demo.test.Person>
</family>
</com.demo.test.Person>
...
XStream xs = new XStream();
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
String xml = xs.toXML(p);
System.out.println(xml);
打印结果
<person code="3">
<name>小明</name>
<age>20</age>
<hobbies>
<string>play</string>
<string>learn</string>
</hobbies>
<family>
<person code="1">
<name>哥哥</name>
<age>22</age>
<hobbies reference="../../../hobbies"/>
</person>
<person code="2">
<name>妹妹</name>
<age>17</age>
</person>
</family>
</person>
xml中hobbies元素标签使用 string元素标签表意不明,修改如下
XStream xs = new XStream();
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));
String xml = xs.toXML(p);
System.out.println(xml);
打印结果
<person code="3">
<name>小明</name>
<age>20</age>
<hobbies>
<hobby>play</hobby>
<hobby>learn</hobby>
</hobbies>
<family>
<person code="1">
<name>哥哥</name>
<age>22</age>
<hobbies reference="../../../hobbies"/>
</person>
<person code="2">
<name>妹妹</name>
<age>17</age>
</person>
</family>
</person>
别名实体类
@XStreamAlias("person")
public class PersonAlias {
@XStreamAlias("code")
@XStreamAsAttribute
private int id;
@XStreamAlias("name")
private String name;
@XStreamAlias("age")
private int age;
@XStreamAlias("hobbies")
private List<String> hobbies;
@XStreamAlias("family")
private List<PersonAlias> family;
public PersonAlias(int id, String name, int age, List<String> hobbies, List<PersonAlias> family) {
this.id = id;
this.name = name;
this.age = age;
this.hobbies = hobbies;
this.family = family;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", hobbies=" + hobbies + ", family=" + family
+ "]";
}
}
XStream xs = new XStream();
xs.autodetectAnnotations(true);
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(PersonAlias.class, "hobbies", new CollectionConverter(classAliasingMapper));
String xml = xs.toXML(palias);
System.out.println(xml);
打印结果
<person code="3">
<name>小明</name>
<age>20</age>
<hobbies>
<hobby>play</hobby>
<hobby>learn</hobby>
</hobbies>
<family>
<person code="1">
<name>哥哥</name>
<age>22</age>
<hobbies reference="../../../hobbies"/>
</person>
<person code="2">
<name>妹妹</name>
<age>17</age>
</person>
</family>
</person>
String xml = "<person code=\"3\"><name>小明</name><age>20</age><hobbies><hobby>play</hobby><hobby>learn</hobby></hobbies><family><person code=\"1\"><name>哥哥</name><age>22</age><hobbies reference=\"../../../hobbies\"/></person><person code=\"2\"><name>妹妹</name><age>17</age></person></family></person>";
XStream xs = new XStream();
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));
xs.allowTypes(new Class[] { Person.class });
Person toPerson = (Person) xs.fromXML(xml);
System.out.println(toPerson);
打印结果
Person [id=3, name=小明, age=20, hobbies=[play, learn], family=[Person [id=1, name=哥哥, age=22, hobbies=[play, learn], family=null], Person [id=2, name=妹妹, age=17, hobbies=null, family=null]]]
引入JSON依赖
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.4.1</version>
</dependency>
XStream xs = new XStream(new JettisonMappedXmlDriver());
xs.alias("person", Person.class);
xs.aliasField("code", Person.class, "id");
xs.useAttributeFor(Person.class, "id");
ClassAliasingMapper classAliasingMapper = new ClassAliasingMapper(xs.getMapper());
classAliasingMapper.addClassAlias("hobby", String.class);
xs.registerLocalConverter(Person.class, "hobbies", new CollectionConverter(classAliasingMapper));
String jsonStr = xs.toXML(p);
System.out.println(jsonStr);
xs.allowTypes(new Class[] { Person.class });
Person toPerson = (Person) xs.fromXML(jsonStr);
System.out.println(toPerson);
打印结果
{"person":{"@code":3,"name":"小明","age":20,"hobbies":[{"hobby":["play","learn"]}],"family":[{"person":[{"@code":1,"name":"哥哥","age":22,"hobbies":[{"@reference":"../../../hobbies"}]},{"@code":2,"name":"妹妹","age":17}]}]}}
Person [id=3, name=小明, age=20, hobbies=[play, learn], family=[Person [id=1, name=哥哥, age=22, hobbies=[play, learn], family=null], Person [id=2, name=妹妹, age=17, hobbies=null, family=null]]]
特殊符号
处理下划线
new XStream(new XppDriver(new XmlFriendlyNameCoder("-", "")))
都不转义
new XStream(new XppDriver(new NoNameCoder()))
XML转Java对象,元素标签不存在Java类中报错
class XStreamEx extends XStream {
@Override
protected MapperWrapper wrapMapper(MapperWrapper next) {
return new MapperWrapper(next) {
@Override
public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) {
if (definedIn == Object.class) {
return false;
}
return super.shouldSerializeMember(definedIn, fieldName);
}
};
}
}