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的根節點去掉和改變列表名字的需求,對應到我們的例子上就是去掉
@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的程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!