JAVA bean与XML互转的利器---XStream 博客分类: xml xmljavaBean
程序员文章站
2024-02-07 22:01:40
...
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;
}
}
结果是这样:
<person age="18">
<name>pli</name>
</person>
在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;
}
}
结果是这样:
<person age="18">
<name>pli</name>
</person>