[XML,Object,Json轉換之淺析Xstream的使用](http://blog.csdn.net/fengyuzhengfan/article/details/39654025)
請尊重他人的勞動成果,轉載請注明出處:[XML,Object,Json轉換之淺析Xstream的使用?](http://blog.csdn.net/fengyuzhengfan/article/details/39654025)
XStream的是一個簡單的庫,主要用于Java對象和XML之間的轉換。但XStream也內置了對Json的支持。
## 1.Xstream的特點:
這里直接引用Xstream官方的敘述:
**靈活易用:**在更高的層次上提供了簡單、靈活、易用的統一接口,用戶無需了解項目的底層細節
**無需映射:**大多數對象都可以在無需映射的情況下進行序列化與反序列化的操作
**高速穩定:**設計時力求達到的最重要的指標是解析速度快、占用內存少,以使之能夠適用于大的對象處理或是對信息吞吐量要求高的系統
**清晰易懂:**項目采用reflection機制得到無冗余信息的XML文件。所生成的XML文件較本地Java序列化產物更簡潔,格式更清晰,更便于用戶閱讀
**無需修改:**完全序列化包括private和final類型在內的全部內部字段。支持非公有類和內部類,類可以沒有缺省的構造函數
**易于集成**:通過實現特定的接口,XStream可以直接與其它任何樹型結構進行序列化與反序列化操作(而不僅僅是XML格式)
**靈活轉換:**轉換策略是可以定制的,允許用戶自定義特殊類型的對象如何以XML格式存儲。
**錯誤處理:**由于XML資料不合法而造成異常時,會提供詳細地診斷信息幫助處理問題。
## 2.初始化XStream類
說Xstream簡單是因為它提供統一入口,主要類XStream用作所有項目的入口點。它將重要組件集成在一起,提供更簡單易用的API操作。
我們可以使用以下的語句進行初始化操作:
XStreamxstream = new XStream();
默認情況下,XStream會采用Xpp3庫,XPP3是一種運行效率非常高的XML全解析實現。如果你不想依靠Xpp3庫的話,也可以使用一個標準的JAXP DOM解析器,可以采用以下語句進行初始化:
//不使用XPP3庫
XStreamxstream = new XStream(new DomDriver());
此xstream實例,為線程安全的,可以供多個線程進行調用,共享使用。參考 com.thoughtworks.xstream.io.xml包,會發現系統提供了多種標識解析器供我們選擇,包括,DomDriver、 JDomDriver、StaxDriver等等。
前面提到了Xstream提供了對Json的支持,是因為Xstream內置了兩個Driver:
1.JsonHierarchicalStreamDriver:不依賴其他類庫,只實現obj->JSON
2.JettisonMappedXmlDriver:依賴jettison類庫,實現 JSON->obj or obj->JSON
兩種Driver在處理相同設置的Object時會得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更簡潔,確如官網所說。
JsonHierarchicalStreamDriver有個小問題——默認輸出帶格式的JSON串,結構中帶空格、換行,并且沒有提供修飾方式。
## 3.常用方法:
*xStream*.toXML(object):將對象轉換成XML、Json。
*xStream*.toXML(obj, outputStream):將對象轉換XML、Json并封裝成輸出流。
*xStream*.toXML(object, writer):將對象轉換XML、Json并封成寫入流。
*xStream*.fromXML():將XML、Json轉換成對象,此方法接受File、InputStream、Reader、String、URL類型的參數。
*xStream*.alias("news", News.**class**):為指定類名創建別名。
*xStream*.useAttributeFor(News.**class**,"id"):將id設為News的元素的屬性。
*xStream*.aliasField("other", BookShelf.**class**,"remark"):修改節點名稱,將BookShelf類中的remark節點名修改為other。
*xStream*.addImplicitCollection(BookShelf.**class**,"books"):去掉集體節點的父節點。
*xStream*.aliasAttribute("姓名","name"):修改屬性的name,為姓名。
## 4.實例1:將對象轉換成XML? ?
~~~
/**
* 將對象轉換成Xml格式的字符串
* @param object 要轉換成Xml的對象
* @return String:Xml格式的字符串
*/
public static String convertObject2Xml(Object object) {
xStream=new XStream();
xStream.alias("news", News.class);//修改元素名稱
xStream.useAttributeFor(News.class, "id");//將id設為News的元素的屬性
return xStream.toXML(object);
}
~~~
## 5.實例2:將XML象轉換成對象
~~~
/**
* 將成Xml格式的字符串轉換成Java對象
* @param inputStream 要轉換成Java對象的inputStream
* @return String:Xml格式的字符串
*/
public static Object convertXml2Object(InputStream inputStream) {
xStream=new XStream();
xStream.alias("news", News.class);//修改元素名稱
xStream.useAttributeFor(News.class, "id");//將id設為News的元素的屬性
return xStream.fromXML(inputStream);//此方法也可將xml轉換成map
}
~~~
## 6.實例3:將對象轉換成Json
~~~
/**
* 將對象轉換成Json格式的字符串
* @param object 要轉換成Json的對象
* @return String:Json格式的字符串
*/
public static String convertObject2Json(Object object) {
xStream = new XStream(newJsonHierarchicalStreamDriver() {
publicHierarchicalStreamWriter createWriter(Writer out) {
//刪除根節點
return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
}
});
return xStream.toXML(object);
}
~~~