xstream是大名鼎鼎的thought works下的一个开源项目, 主要功能是提供java bean 和xml文本之间的转换,另外还提供java bean和json之间的转换,这个不在本次讨论的范围内。
在java1.5以后xsteam也支持了annotation。 这时就只要在java bean中添加若干annotation就可以了,当然如果不允许修改java bean, 那xstream也提供register的方式,也是很简单的。通过几个方面具体说明一下:
1.基本转换;
2.使用别名;
3.处理属性;
4.处理list类型属性;
5.属性不参与转换;
1. 基本转换
这是一个普通的java bean:
package xstreamtest;
public class person {
private string name;
private int age;
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
转换代码是这样的:
xstream xstream = new xstream();
person person = new person();
person.setname("pli");
person.setage(18);
system.out.println(xstream.toxml(person));
我们得到了这样的结果:
<xstreamtest.person>
<name>pli</name>
<age>18</age>
</xstreamtest.person>
但是 有时候根标签不想使用包路径,如何搞呢,使用别名
2. 起别名
家丁我们希望将“xstreamtest.person” 这个莫名其妙的element标签改为“person”我们应该这么做。
package xstreamtest;
@xstreamalias("person")
public class person {
private string name;
private int age;
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
而执行代码会变成这样:
xstream xstream = new xstream();
xstream.autodetectannotations(true);
person person = new person();
person.setname("pli");
person.setage(18);
system.out.println(xstream.toxml(person));
这样我们就得到了想要的:
<person>
<name>pli</name>
<age>18</age>
</person>
3. 处理属性
如果想要将java bean中的“age”属性作为xml中person标签的一个attribute该怎么办呢。
这里介绍另外一个annotation:@xstreamasattribute, 我们的java bean变成了这样:
@xstreamalias("person")
public class person {
private string name;
@xstreamasattribute
private int age;
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
结果是这样的:
<person age="18">
<name>pli</name>
</person>
4. 处理list
如果java bean中有list是什么情形呢。
@xstreamalias("person")
public class person {
private string name;
@xstreamasattribute
private int age;
list<string> girlfriends;
public list<string> getgirlfriends() {
return girlfriends;
}
public void setgirlfriends(list<string> girlfriends) {
this.girlfriends = girlfriends;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
直接转换我们会得到这样的结果:
<person age="18">
<name>pli</name>
<girlfriends>
<string>yuanyuangao</string>
<string>qishu</string>
<string>bozhizhang</string>
</girlfriends>
</person>
xstream在这里提供了一个@xstreamimplicit(itemfieldname=***)的annotation来满足用户想将list的根节点去掉和改变列表名字的需求,对应到我们的例子上就是去掉<girlfriends>标签和改变"<string>".我们来看看效果。
@xstreamalias("person")
public class person {
private string name;
@xstreamasattribute
private int age;
@xstreamimplicit(itemfieldname="girl")
list<string> girlfriends;
public list<string> getgirlfriends() {
return girlfriends;
}
public void setgirlfriends(list<string> girlfriends) {
this.girlfriends = girlfriends;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
结果是这样:
<person age="18">
<name>pli</name>
<girl>yuanyuangao</girl>
<girl>qishu</girl>
<girl>bozhizhang</girl>
</person>
5. 忽略属性
如果在java bean中有些属性不想被序列化,xstream提供了解决这个需求的annotation: @xstreamomitfield
比如说不想讲girlfriends这个list序列化
@xstreamalias("person")
public class person {
private string name;
@xstreamasattribute
private int age;
@xstreamimplicit(itemfieldname="girl")
@xstreamomitfield
list<string> girlfriends;
public list<string> getgirlfriends() {
return girlfriends;
}
public void setgirlfriends(list<string> girlfriends) {
this.girlfriends = girlfriends;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
public void setname(string name) {
this.name = name;
}
public string getname() {
return this.name;
}
}
以上就是javabean与xml互转的利器-xstream的代码详解的详细内容。