XStream既可以把对象转换为XML,也可以把XML转换为对象。下面的代码是他的一些简单使用。
@Test
public void test01() {
//1、创建XStream对象
XStream stream = new XStream();
//默认的名称使用的是包的名称可以通过alias改别名
stream.alias("person", Person.class);
//改属性名也是可以的,一般不用
stream.aliasField("username",Person.class, "name");
//如果希望把某个子节点修改为属性也可以,但是更不常用
stream.useAttributeFor(Person.class, "id");
//2、创建对象
Person p = new Person(1,"小武",1900,24);
//3、完成转换
String xml = stream.toXML(p);
//4、输出
System.out.println(xml);
}
//对象里面有关联对象
@Test
public void test02() {
XStream stream = new XStream();
stream.alias("user", User.class);
stream.alias("group",Group.class);
User u = new User(1,"劳动法","123",new Group(1,"财务处"));
System.out.println(stream.toXML(u));
}
//转换一组对象
@Test
public void test03() {
XStream stream = new XStream();
stream.alias("user", User.class);
//设置别名users
stream.alias("users",List.class);
List<User> us = new ArrayList<User>();
User u = new User(1,"劳动法","123",new Group(1,"财务处"));
us.add(u);
us.add(new User(2,"张学友","123",new Group(1,"财务处")));
us.add(new User(3,"黎明","123",new Group(1,"财务处")));
us.add(new User(4,"郭富城","123",new Group(1,"物理系")));
System.out.println(stream.toXML(us));
}
//隐藏某个节点
@Test
public void test04() {
XStream stream = new XStream();
stream.alias("user",User.class);
stream.alias("group", Group.class);
Group g = new Group();
/* * 默认情况在users这个节点中会像封装一个users的父亲节点,然后才封装user * 有些时候可能不需要users可以使用 */
stream.addImplicitCollection(Group.class, "users");
g.addUser(new User(1,"老张","123"));
g.addUser(new User(2,"老李","1234"));
g.addUser(new User(3,"老刘","12345"));
g.addUser(new User(4,"老王","123456"));
System.out.println(stream.toXML(g));
}
//将xml转换为对象
@Test
public void test05() {
XStream stream = new XStream();
stream.alias("user", User.class);
String xml = "<user><id>1</id><username>aaa</username><password>123</password>" +
"<group><id>1</id><name>财务处</name></group></user>";
User user = (User)stream.fromXML(xml);
System.out.println(user.getId()+","+user.getUsername()+","+user.getPassword()+","+user.getGroup().getName());
}
//将xml转换为对象列表
@Test
public void test06() {
XStream stream = new XStream();
stream.alias("user", User.class);
stream.alias("users",List.class);
List<User> us = (List<User>)stream.fromXML(TestXstream.class.getClassLoader().getResourceAsStream("users.xml"));
for(User user:us) {
System.out.println(user.getId()+","+user.getUsername()+","+user.getPassword()+","+user.getGroup().getName());
}
}
//转化为jason
@Test
public void test07() {
//转换json需要使用Jettison这个包
XStream stream = new XStream(new JettisonMappedXmlDriver(){
//通过覆盖以下方法可以有效的删除json根节点
//一般不使用XStream来转换json,效率不高,效率比较高的Json工具是Jaskson
@Override
public HierarchicalStreamWriter createWriter(Writer out) {
return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
}
});
stream.alias("group",Group.class);
stream.alias("user", User.class);
Group g = new Group();
g.addUser(new User(1,"老张","123"));
g.addUser(new User(2,"老李","1234"));
g.addUser(new User(3,"老刘","12345"));
g.addUser(new User(4,"老王","123456"));
System.out.println(stream.toXML(g));
}
上述代码用到的对象
public class User {
private int id;
private String username;
private String password;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public User() {
}
public User(int id, String username, String password, Group group) {
super();
this.id = id;
this.username = username;
this.password = password;
this.group = group;
}
public User(int id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
}
public class Group {
private int id;
private String name;
List<User> users;
public void addUser(User u) {
if(users==null) {
users = new ArrayList<User>();
}
users.add(u);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group(int id, String name) {
super();
this.id = id;
this.name = name;
}
public Group() {
}
}
test06使用到的xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<id>1</id>
<username>劳动法</username>
<password>123</password>
<group>
<id>1</id>
<name>财务处</name>
</group>
</user>
<user>
<id>2</id>
<username>张学友</username>
<password>123</password>
<group>
<id>1</id>
<name>财务处</name>
</group>
</user>
<user>
<id>3</id>
<username>黎明</username>
<password>123</password>
<group>
<id>1</id>
<name>财务处</name>
</group>
</user>
<user>
<id>4</id>
<username>郭富城</username>
<password>123</password>
<group>
<id>1</id>
<name>物理系</name>
</group>
</user>
</users>
根据上述代码,我们可以做一个XStreamUtil来帮助我们更方便的使用他。
public class XStreamUtil {
private static XStreamUtil util;
private XStreamUtil(){}
public static XStreamUtil getInstacne() {
if(util==null) util = new XStreamUtil();
return util;
}
public String obj2xml(Object obj,Map<String,Class<?>> alias) {
XStream stream = new XStream();
Set<String> keys = alias.keySet();
for(String key:keys) {
stream.alias(key,alias.get(key));
}
return stream.toXML(obj);
}
public Object xml2obj(String xml,Map<String,Class<?>> alias) {
XStream stream = new XStream();
Set<String> keys = alias.keySet();
for(String key:keys) {
stream.alias(key,alias.get(key));
}
return stream.fromXML(xml);
}
}