首頁  >  文章  >  後端開發  >  JAVAbean與XML互轉的利器-XStream的程式碼詳解

JAVAbean與XML互轉的利器-XStream的程式碼詳解

黄舟
黄舟原創
2017-03-31 14:01:491539瀏覽

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的根節點去掉和改變列表名字的需求,對應到我們的例子上就是去掉4e4533e6d53566a86c3dd22301ca0fe8標籤和改變"98c455a79ddfebb79781bff588e7b37e".我們來看看效果。

@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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn