其實XStream和JAXB在一些觀念上是很相似的
但是JAXB作爲Java EE的一個規範 是非常正式的 且和其他很多規範有聯繫 是一種標準的實現
這邊簡單說說實現方式(博客裏有文介紹使用):
1.一個實體類,使用@XmlRootElement表示一下類(最簡單的)
2.建立一個ObjectFactory用來產生這個實體類
3.使用JAXBContext 然後產生Marshaller(對象-->xml)或者UnMarshaller(xml-->對象)
而XStream使用起來更爲簡單
1.首先從XStream官網下載XStream
http://xstream.codehaus.org/download.html
2.下載後解壓 將lib下的jar添加入項目就可以了
如下:
然後就可以編寫代碼了
爲了方便 直接使用XStream的annotation:
3.實體類 Person:
- package org.cc.vo;
- import java.util.List;
- import com.thoughtworks.xstream.annotations.XStreamAlias;
- import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
- import com.thoughtworks.xstream.annotations.XStreamImplicit;
- import com.thoughtworks.xstream.annotations.XStreamOmitField;
- @XStreamAlias("Person")
- public class Person {
- @XStreamAlias("name")
- @XStreamAsAttribute
- private String name;
- @XStreamAlias("age")
- private int age;
- @XStreamAlias("sex")
- private boolean sex;
- @XStreamImplicit(itemFieldName="favor")
- private List<String> favor;
- @XStreamOmitField
- private int tempid;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public boolean isSex() {
- return sex;
- }
- public void setSex(boolean sex) {
- this.sex = sex;
- }
- public List<String> getFavor() {
- return favor;
- }
- public void setFavor(List<String> favor) {
- this.favor = favor;
- }
- public int getTempid() {
- return tempid;
- }
- public void setTempid(int tempid) {
- this.tempid = tempid;
- }
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + ", sex=" + sex
- + ", favor=" + favor + ", tempid=" + tempid + "]";
- }
- }
package org.cc.vo;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
@XStreamAlias("Person")
public class Person {
@XStreamAlias("name")
@XStreamAsAttribute
private String name;
@XStreamAlias("age")
private int age;
@XStreamAlias("sex")
private boolean sex;
@XStreamImplicit(itemFieldName="favor")
private List<String> favor;
@XStreamOmitField
private int tempid;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
public List<String> getFavor() {
return favor;
}
public void setFavor(List<String> favor) {
this.favor = favor;
}
public int getTempid() {
return tempid;
}
public void setTempid(int tempid) {
this.tempid = tempid;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex
+ ", favor=" + favor + ", tempid=" + tempid + "]";
}
}
@XStreamAlias(value)是別名 可以用在類名和屬性名上修改顯示的xml中的標籤
@XStreamAsAttribute 把屬性作爲xml中的屬性 而不是子元素
@XStreamImplicit(itemFieldName="favor") 還有一個keyFieldName的屬性 這個是用來改寫List和Map的顯示 的
@XStreamOmitField 此標記的屬性不會序列化
4.接下去只有一步,沒有JAXB的建立ObjectFactory那一部,實現起來非常簡潔直觀:
- package org.cc.vo;
- import java.util.ArrayList;
- import java.util.List;
- import com.thoughtworks.xstream.XStream;
- import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
- public class Main {
- public static void main(String[] args) {
- XStream x=new XStream();
- // XStream x = new XStream(new JettisonMappedXmlDriver());
- x.processAnnotations(Person.class);
- Person p=new Person();
- p.setAge(30);
- List<String> fa=new ArrayList<String>();
- fa.add("遊戲");
- fa.add("上網");
- p.setFavor(fa);
- p.setName("cc");
- String info=x.toXML(p);
- System.out.println(info);
- Person p2=(Person)x.fromXML(info);
- System.out.println(p2);
- }
- }
package org.cc.vo;
import java.util.ArrayList;
import java.util.List;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
public class Main {
public static void main(String[] args) {
XStream x=new XStream();
// XStream x = new XStream(new JettisonMappedXmlDriver());
x.processAnnotations(Person.class);
Person p=new Person();
p.setAge(30);
List<String> fa=new ArrayList<String>();
fa.add("遊戲");
fa.add("上網");
p.setFavor(fa);
p.setName("cc");
String info=x.toXML(p);
System.out.println(info);
Person p2=(Person)x.fromXML(info);
System.out.println(p2);
}
}
輸出:
- <Person name="cc">
- <age>30</age>
- <sex>false</sex>
- <favor>遊戲</favor>
- <favor>上網</favor>
- </Person>
- Person [name=cc, age=30, sex=false, favor=[遊戲, 上網], tempid=0]
注意了以上代碼註釋掉的那塊打開 並把沒有參數的構造方法的XStream那一段註釋掉產生的就是JSON(換了一個引擎)
產生內容如下:
- {"Person":{"@name":"cc","age":30,"sex":false,"favor":["遊戲","上網"]}}
- Person [name=cc, age=30, sex=false, favor=[遊戲, 上網], tempid=0]
{"Person":{"@name":"cc","age":30,"sex":false,"favor":["遊戲","上網"]}}
Person [name=cc, age=30, sex=false, favor=[遊戲, 上網], tempid=0]