詳解XML,Object,Json轉(zhuǎn)換與Xstream的使用
詳解XML,Object,Json轉(zhuǎn)換與Xstream的使用
1.Xstream的特點(diǎn):
這里直接引用Xstream官方的敘述:
- 靈活易用:在更高的層次上提供了簡單、靈活、易用的統(tǒng)一接口,用戶無需了解項(xiàng)目的底層細(xì)節(jié)
- 無需映射:大多數(shù)對(duì)象都可以在無需映射的情況下進(jìn)行序列化與反序列化的操作
- 高速穩(wěn)定:設(shè)計(jì)時(shí)力求達(dá)到的最重要的指標(biāo)是解析速度快、占用內(nèi)存少,以使之能夠適用于大的對(duì)象處理或是對(duì)信息吞吐量要求高的系統(tǒng)
- 清晰易懂:項(xiàng)目采用reflection機(jī)制得到無冗余信息的XML文件。所生成 的XML文件較本地Java序列化產(chǎn)物更簡潔,格式更清晰,更便于用戶閱讀
- 無需修改:完全序列化包括private和final類型在內(nèi)的全部內(nèi)部字段。支 持非公有類和內(nèi)部類,類可以沒有缺省的構(gòu)造函數(shù)
- 易于集成:通過實(shí)現(xiàn)特定的接口,XStream可以直接與其它任何樹型結(jié)構(gòu)進(jìn)行序列化與反序 列化操作(而不僅僅是XML格式)
- 靈活轉(zhuǎn)換:轉(zhuǎn)換策略是可以定制的,允許用戶自定義特殊類型的對(duì)象如何以XML格式存儲(chǔ)。
- 錯(cuò)誤處理:由于XML資料不合法而造成異常時(shí),會(huì)提供詳細(xì)地診斷信息幫助處理問題。
2.初始化XStream類
說Xstream簡單是因?yàn)樗峁┙y(tǒng)一入口,主要類XStream用作所有項(xiàng)目的入口點(diǎn)。它將重要組件集成在一起,提供更簡單易用的API操作。
我們可以使用以下的語句進(jìn)行初始化操作:
XStreamxstream = new XStream();
默認(rèn)情況下,XStream會(huì) 采用Xpp3庫,XPP3是一種運(yùn)行效率非常高的XML全解析實(shí)現(xiàn)。如果你不想依靠Xpp3庫的話,也可以使用一個(gè)標(biāo)準(zhǔn)的JAXP DOM解析器,可以采用以下語句進(jìn)行初始化:
//不使用XPP3庫
XStreamxstream = new XStream(new DomDriver());
此xstream實(shí)例,為線程安全的,可以供多個(gè)線程進(jìn)行調(diào)用,共享使用。參考 com.thoughtworks.xstream.io.xml包,會(huì)發(fā)現(xiàn)系統(tǒng)提供了多種標(biāo)識(shí)解析器供我們選擇,包括,DomDriver、 JDomDriver、StaxDriver等等。
前面提到了Xstream提供了對(duì)Json的支持,是因?yàn)閄stream內(nèi)置了兩個(gè)Driver:
1.JsonHierarchicalStreamDriver:不依賴其他類庫,只實(shí)現(xiàn) obj->JSON
2.JettisonMappedXmlDriver:依賴jettison類庫,實(shí)現(xiàn) JSON->obj or obj->JSON
兩種Driver在處理相同設(shè)置的Object時(shí)會(huì)得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更簡潔,確如官網(wǎng)所說。
JsonHierarchicalStreamDriver有個(gè)小問題——默認(rèn)輸出帶格式的JSON串,結(jié)構(gòu)中帶空格、換行,并且沒有提供修飾方式。
3.常用方法:
xStream.toXML(object):將對(duì)象轉(zhuǎn)換成XML、Json。 xStream.toXML(obj, outputStream):將對(duì)象轉(zhuǎn)換XML、Json并封裝成輸出流。 xStream.toXML(object, writer): 將對(duì)象轉(zhuǎn)換XML、Json并封成寫入流。 xStream.fromXML():將XML、Json轉(zhuǎn)換成對(duì)象,此方法接受File、InputStream、Reader、String、URL類型的參數(shù)。 xStream.alias("news", News.class):為指定類名創(chuàng)建別名。 xStream.useAttributeFor(News.class, "id"):將id設(shè)為 News的元素的屬性。 xStream.aliasField("other", BookShelf.class,"remark"):修改節(jié)點(diǎn)名稱,將BookShelf類中的remark節(jié)點(diǎn)名修改為other。 xStream.addImplicitCollection(BookShelf.class, "books"):去掉集體節(jié)點(diǎn)的父節(jié)點(diǎn)。 xStream.aliasAttribute("姓名", "name"):修改屬性的name,為姓名。
4.實(shí)例1:將對(duì)象轉(zhuǎn)換成XML
/** * 將對(duì)象轉(zhuǎn)換成Xml格式的字符串 * @param object 要轉(zhuǎn)換成Xml的對(duì)象 * @return String:Xml格式的字符串 */ public static String convertObject2Xml(Object object) { xStream=new XStream(); xStream.alias("news", News.class);//修改元素名稱 xStream.useAttributeFor(News.class, "id");//將id設(shè)為News的元素的屬性 return xStream.toXML(object); }
5.實(shí)例2:將XML象轉(zhuǎn)換成對(duì)象
/** * 將成Xml格式的字符串轉(zhuǎn)換成Java對(duì)象 * @param inputStream 要轉(zhuǎn)換成Java對(duì)象的inputStream * @return String:Xml格式的字符串 */ public static Object convertXml2Object(InputStream inputStream) { xStream=new XStream(); xStream.alias("news", News.class);//修改元素名稱 xStream.useAttributeFor(News.class, "id");//將id設(shè)為News的元素的屬性 return xStream.fromXML(inputStream);//此方法也可將xml轉(zhuǎn)換成map }
6.實(shí)例3:將對(duì)象轉(zhuǎn)換成Json
/** * 將對(duì)象轉(zhuǎn)換成Json格式的字符串 * @param object 要轉(zhuǎn)換成Json的對(duì)象 * @return String:Json格式的字符串 */ public static String convertObject2Json(Object object) { xStream = new XStream(newJsonHierarchicalStreamDriver() { publicHierarchicalStreamWriter createWriter(Writer out) { //刪除根節(jié)點(diǎn) return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE); } }); return xStream.toXML(object); }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
MybatisX-Generator自動(dòng)代碼生成插件教程
這篇文章主要介紹了MybatisX-Generator自動(dòng)代碼生成插件教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Java根據(jù)模板導(dǎo)出Excel報(bào)表并復(fù)制模板生成多個(gè)Sheet頁
本文主要介紹了Java根據(jù)模板導(dǎo)出Excel報(bào)表并復(fù)制模板生成多個(gè)Sheet頁的方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03解決使用@ResponseBody后返回500錯(cuò)誤的問題
這篇文章主要介紹了解決使用@ResponseBody后返回500錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09java開啟遠(yuǎn)程debug竟有兩種參數(shù)(最新推薦)
這篇文章主要介紹了java開啟遠(yuǎn)程debug竟有兩種參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07SpringBoot下Mybatis的緩存的實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringBoot下Mybatis的緩存的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Spring自定義注解的實(shí)現(xiàn)與使用方式
注解是Java中用于類、方法、參數(shù)、包的裝飾標(biāo)志,本身不具備功能,但可定義參數(shù),Java包含內(nèi)建注解和元注解,如@Target、@Retention等,描述注解的使用范圍和生命周期,Spring的AOP(面向切面編程)可以結(jié)合注解實(shí)現(xiàn)功能,如權(quán)限控制和日志記錄2024-09-09