日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

xStream转换XML、JSON

發布時間:2025/3/20 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xStream转换XML、JSON 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 簡介

xStream可以很容易實現Java對象和xml文檔互相轉換, 可以修改某個特定的屬性和節點名稱,xStream提供annotation注解,

可以在JavaBean中完成對xml節點和屬性的描述,并支持Json的轉換,只需要提供相關的JSONDriver就能完成轉換

官方網站:?http://xstream.codehaus.org/tutorial.html

?

?

二. 準備工作

1. 環境準備:

Jar文件下載地址:

https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/xstream-distribution/1.3.1/xstream-distribution-1.3.1-bin.zip

代碼結構圖:

?

2. junit測試代碼:

?

[java]?view plaincopy
  • public?class?XStreamTest?{??
  • ????private?XStream?xstream;??
  • ????private?ObjectOutputStream?out;??
  • ????private?ObjectInputStream?in;??
  • ????private?Student?student;??
  • ??
  • ????/**?
  • ?????*?初始化資源準備?
  • ?????*/??
  • ????@Before??
  • ????public?void?init()?{??
  • ????????try?{??
  • ????????????xstream?=?new?XStream(new?DomDriver());??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????student?=?new?Student();??
  • ????????student.setAddress("china");??
  • ????????student.setEmail("jack@email.com");??
  • ????????student.setId(1);??
  • ????????student.setName("jack");??
  • ????????Birthday?birthday?=?new?Birthday();???
  • ????????birthday.setBirthday("2010-11-22");??
  • ????????student.setBirthday(birthday);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?釋放對象資源?
  • ?????*/??
  • ????@After??
  • ????public?void?destory()?{??
  • ????????xstream?=?null;??
  • ????????student?=?null;??
  • ????????try?{??
  • ????????????if?(out?!=?null)?{??
  • ????????????????out.flush();??
  • ????????????????out.close();??
  • ????????????}??
  • ????????????if?(in?!=?null)?{??
  • ????????????????in.close();??
  • ????????????}??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????System.gc();??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?打印字符串?
  • ?????*/??
  • ????public?final?void?print(String?string)?{???
  • ????????System.out.println(string);??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?高亮字符串?
  • ?????*/??
  • ????public?final?void?highLight(String?string)?{??
  • ????????System.err.println(string);??
  • ????}??
  • ??
  • }??

  • 3. 所需實體類:

    ?

    (1)Student:

    ?

    [java]?view plaincopy
  • public?class?Student?{??
  • ????private?int?id;??
  • ????private?String?name;??
  • ????private?String?email;??
  • ????private?String?address;??
  • ????private?Birthday?birthday;??
  • ????//?getter?and?setter??
  • ????public?String?toString()?{??
  • ????????return?this.name?+?"#"?+?this.id?+?"#"?+?this.address?+?"#"?+?this.birthday?+?"#"?+?this.email;??
  • ????}??
  • }??
  • ?

    ?

    (2)Birthday

    ?

    [java]?view plaincopy
  • public?class?Birthday?{??
  • ????private?String?birthday;??
  • ??
  • ????public?Birthday()?{??
  • ????}??
  • ??????
  • ????public?Birthday(String?birthday)?{??
  • ????????this.birthday?=?birthday;??
  • ????}??
  • ??
  • ????public?String?getBirthday()?{??
  • ????????return?birthday;??
  • ????}??
  • ??
  • ????public?void?setBirthday(String?birthday)?{??
  • ????????this.birthday?=?birthday;??
  • ????}??
  • }??

  • 三 Java對象轉為xml

    1. 將JavaBean轉成xml文檔:

    ?

    [java]?view plaincopy
  • /**??
  • ?????*?Java對象轉換成XML?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeBean2XML()?{??
  • ????????try?{??
  • ????????????highLight("======?Bean?->?XML?======");??
  • ????????????print("<!--?沒有重命名的XML?-->");??
  • ????????????print(xstream.toXML(student));??
  • ??????????????
  • ????????????print("<!--?重命名后的XML?-->");??
  • ????????????//?類重命名??
  • ????????????xstream.alias("student",?Student.class);??
  • ????????????xstream.alias("生日",?Birthday.class);??
  • ????????????xstream.aliasField("生日",?Student.class,?"birthday");??
  • ????????????xstream.aliasField("生日",?Birthday.class,?"birthday");??
  • ??
  • ????????????//?屬性重命名??
  • ????????????xstream.aliasField("郵件",?Student.class,?"email");??
  • ??
  • ????????????//?包重命名??
  • ????????????xstream.aliasPackage("zdp",?"com.zdp.domain");??
  • ????????????print(xstream.toXML(student));??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    [html]?view plaincopy
  • ======?Bean?->?XML?======??
  • <!--?沒有重命名的XML?-->??
  • <com.zdp.domain.Student>??
  • ??<id>1</id>??
  • ??<name>jack</name>??
  • ??<email>jack@email.com</email>??
  • ??<address>china</address>??
  • ??<birthday>??
  • ????<birthday>2010-11-22</birthday>??
  • ??</birthday>??
  • </com.zdp.domain.Student>??
  • <!--?重命名后的XML?-->??
  • <student>??
  • ??<id>1</id>??
  • ??<name>jack</name>??
  • ??<郵件>jack@email.com</郵件>??
  • ??<address>china</address>??
  • ??<生日>??
  • ????<生日>2010-11-22</生日>??
  • ??</生日>??
  • </student>??
  • 第一份文檔是沒有經過修改或重命名的文檔, 按照原樣輸出。

    第二份文檔的類、屬性、包都經過了重命名。

    ?

    2. 將List集合轉成xml文檔:

    [java]?view plaincopy
  • /**?
  • ?????*?將List集合轉換成XML對象?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeList2XML()?{??
  • ????????try?{??
  • ????????????//?修改元素名稱??
  • ????????????highLight("======?List?-->?XML?======");??
  • ????????????xstream.alias("beans",?ListBean.class);??
  • ????????????xstream.alias("student",?Student.class);??
  • ????????????ListBean?listBean?=?new?ListBean();??
  • ????????????listBean.setName("this?is?a?List?Collection");??
  • ??
  • ????????????List<Object>?list?=?new?ArrayList<Object>();??
  • ????????????//?引用javabean??
  • ????????????list.add(student);??
  • ????????????list.add(student);???
  • ????????????//?list.add(listBean);?引用listBean,父元素??
  • ??
  • ????????????student?=?new?Student();??
  • ????????????student.setAddress("china");??
  • ????????????student.setEmail("tom@125.com");??
  • ????????????student.setId(2);??
  • ????????????student.setName("tom");??
  • ????????????Birthday?birthday?=?new?Birthday("2010-11-22");???
  • ????????????student.setBirthday(birthday);??
  • ??
  • ????????????list.add(student);??
  • ????????????listBean.setList(list);??
  • ??????????????
  • ????????????//?將ListBean中的集合設置空元素,即不顯示集合元素標簽??
  • ????????????//?xstream.addImplicitCollection(ListBean.class,?"list");??
  • ??????????????
  • ????????????//?設置reference模型??
  • ????????????xstream.setMode(XStream.ID_REFERENCES);?//?id引用??
  • ????????????//xstream.setMode(XStream.NO_REFERENCES);?//?不引用??
  • ????????????//xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);?//?絕對路徑引用??
  • ??????????????
  • ????????????//?將name設置為父類(Student)的元素的屬性??
  • ????????????xstream.useAttributeFor(Student.class,?"name");??
  • ????????????xstream.useAttributeFor(Birthday.class,?"birthday");??
  • ??????????????
  • ????????????//?修改屬性的name??
  • ????????????xstream.aliasAttribute("姓名",?"name");??
  • ????????????xstream.aliasField("生日",?Birthday.class,?"birthday");??
  • ??
  • ????????????print(xstream.toXML(listBean));??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    [html]?view plaincopy
  • ======?List?-->?XML?======??
  • <beans?id="1">??
  • ??<name>this?is?a?List?Collection</name>??
  • ??<list?id="2">??
  • ????<student?id="3"?姓名="jack">??
  • ??????<id>1</id>??
  • ??????<email>jack@email.com</email>??
  • ??????<address>china</address>??
  • ??????<birthday?id="4"?生日="2010-11-22"/>??
  • ????</student>??
  • ????<student?reference="3"/>??
  • ????<student?id="5"?姓名="tom">??
  • ??????<id>2</id>??
  • ??????<email>tom@125.com</email>??
  • ??????<address>china</address>??
  • ??????<birthday?id="6"?生日="2010-11-22"/>??
  • ????</student>??
  • ??</list>??
  • </beans>??

  • 3. 在JavaBean中添加Annotation注解進行重命名設置

    (1)JavaBean代碼:

    ?

    [java]?view plaincopy
  • @XStreamAlias("class")??
  • public?class?Classes?{??
  • ??
  • ????@XStreamAsAttribute??
  • ????@XStreamAlias("名稱")??
  • ????private?String?name;??
  • ??
  • ????@XStreamOmitField??
  • ????private?int?number;??
  • ??
  • ????@XStreamImplicit(itemFieldName?=?"Students")??
  • ????private?List<Student>?students;??
  • ??
  • ????@XStreamConverter(SingleValueCalendarConverter.class)??
  • ????private?Calendar?created?=?new?GregorianCalendar();??
  • ??
  • ????public?Classes()?{??
  • ????}??
  • ??
  • ????public?Classes(String?name,?Student...?stu)?{??
  • ????????this.name?=?name;??
  • ????????this.students?=?Arrays.asList(stu);??
  • ????}??
  • ??
  • ????public?String?getName()?{??
  • ????????return?name;??
  • ????}??
  • ??
  • ????public?void?setName(String?name)?{??
  • ????????this.name?=?name;??
  • ????}??
  • ??
  • ????public?int?getNumber()?{??
  • ????????return?number;??
  • ????}??
  • ??
  • ????public?void?setNumber(int?number)?{??
  • ????????this.number?=?number;??
  • ????}??
  • ??
  • ????public?List<Student>?getStudents()?{??
  • ????????return?students;??
  • ????}??
  • ??
  • ????public?void?setStudents(List<Student>?students)?{??
  • ????????this.students?=?students;??
  • ????}??
  • ??
  • ????public?Calendar?getCreated()?{??
  • ????????return?created;??
  • ????}??
  • ??
  • ????public?void?setCreated(Calendar?created)?{??
  • ????????this.created?=?created;??
  • ????}??
  • ??????
  • }??

  • ?

    (2)編寫類型轉換器:

    ?

    [java]?view plaincopy
  • public?class?SingleValueCalendarConverter?implements?Converter?{??
  • ????public?void?marshal(Object?source,?HierarchicalStreamWriter?writer,?MarshallingContext?context)?{??
  • ????????Calendar?calendar?=?(Calendar)?source;??
  • ????????writer.setValue(String.valueOf(calendar.getTime().getTime()));??
  • ????}??
  • ??
  • ????public?Object?unmarshal(HierarchicalStreamReader?reader,?UnmarshallingContext?context)?{??
  • ????????GregorianCalendar?calendar?=?new?GregorianCalendar();??
  • ????????calendar.setTime(new?Date(Long.parseLong(reader.getValue())));??
  • ????????return?calendar;??
  • ????}??
  • ??
  • ????public?boolean?canConvert(Class?type)?{??
  • ????????return?type.equals(GregorianCalendar.class);??
  • ????}??
  • }??

  • (3)測試代碼:

    ?

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?使用注解將List轉為XML文檔?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeList2XML4Annotation()?{??
  • ????????try?{??
  • ????????????highLight("======?annotation?Bean?-->?XML?======");??
  • ????????????Student?stu?=?new?Student();??
  • ????????????stu.setName("jack");??
  • ????????????Classes?c?=?new?Classes("一班",?student,?stu);??
  • ????????????c.setNumber(2);??
  • ????????????xstream.alias("student",?Student.class);??
  • ????????????print(xstream.toXML(c));??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    ?

    ?

    [html]?view plaincopy
  • ======?annotation?Bean?-->?XML?======??
  • <com.zdp.domain.Classes>??
  • ??<name>一班</name>??
  • ??<number>2</number>??
  • ??<students?class="java.util.Arrays$ArrayList">??
  • ????<a?class="student-array">??
  • ??????<student>??
  • ????????<id>1</id>??
  • ????????<name>jack</name>??
  • ????????<email>jack@email.com</email>??
  • ????????<address>china</address>??
  • ????????<birthday>??
  • ??????????<birthday>2010-11-22</birthday>??
  • ????????</birthday>??
  • ??????</student>??
  • ??????<student>??
  • ????????<id>0</id>??
  • ????????<name>jack</name>??
  • ??????</student>??
  • ????</a>??
  • ??</students>??
  • ??<created>??
  • ????<time>1409821431920</time>??
  • ????<timezone>Asia/Shanghai</timezone>??
  • ??</created>??
  • </com.zdp.domain.Classes>??

  • 4.?將Map集合轉成xml文檔:

    ?

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?將Map集合轉成XML文檔?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeMap2XML()?{??
  • ????????try?{??
  • ????????????highLight("======?Map?-->?XML?======");??
  • ????????????Map<String,?Student>?map?=?new?HashMap<String,?Student>();??
  • ????????????map.put("No.1",?student);??
  • ??
  • ????????????student?=?new?Student();??
  • ????????????student.setAddress("china");??
  • ????????????student.setEmail("tom@125.com");??
  • ????????????student.setId(2);??
  • ????????????student.setName("tom");??
  • ????????????Birthday?day?=?new?Birthday("2010-11-22");??
  • ????????????student.setBirthday(day);??
  • ????????????map.put("No.2",?student);??
  • ??
  • ????????????student?=?new?Student();??
  • ????????????student.setName("jack");??
  • ????????????map.put("No.3",?student);??
  • ??
  • ????????????xstream.alias("student",?Student.class);??
  • ????????????xstream.alias("key",?String.class);??
  • ????????????xstream.useAttributeFor(Student.class,?"id");??
  • ????????????xstream.useAttributeFor("birthday",?String.class);??
  • ????????????print(xstream.toXML(map));??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    ?

    ?

    [html]?view plaincopy
  • ======?Map?-->?XML?======??
  • <map>??
  • ??<entry>??
  • ????<key>No.3</key>??
  • ????<student?id="0">??
  • ??????<name>jack</name>??
  • ????</student>??
  • ??</entry>??
  • ??<entry>??
  • ????<key>No.1</key>??
  • ????<student?id="1">??
  • ??????<name>jack</name>??
  • ??????<email>jack@email.com</email>??
  • ??????<address>china</address>??
  • ??????<birthday?birthday="2010-11-22"/>??
  • ????</student>??
  • ??</entry>??
  • ??<entry>??
  • ????<key>No.2</key>??
  • ????<student?id="2">??
  • ??????<name>tom</name>??
  • ??????<email>tom@125.com</email>??
  • ??????<address>china</address>??
  • ??????<birthday?birthday="2010-11-22"/>??
  • ????</student>??
  • ??</entry>??
  • </map>??

  • 5.?用OutStream輸出流寫XML

    ?

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?用OutStream輸出流寫XML?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeXML4OutStream()?{??
  • ????????try?{??
  • ????????????out?=?xstream.createObjectOutputStream(System.out);??
  • ????????????Student?stu?=?new?Student();??
  • ????????????stu.setName("jack");??
  • ????????????Classes?c?=?new?Classes("一班",?student,?stu);??
  • ????????????c.setNumber(2);??
  • ????????????highLight("======?ObjectOutputStream?##?JavaObject-->?XML?======");??
  • ????????????out.writeObject(stu);??
  • ????????????out.writeObject(new?Birthday("2010-05-33"));??
  • ????????????out.write(22);//byte??
  • ????????????out.writeBoolean(true);??
  • ????????????out.writeFloat(22.f);??
  • ????????????out.writeUTF("hello");??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    ?

    ?

    [html]?view plaincopy
  • ======?ObjectOutputStream?##?JavaObject-->?XML?======??
  • <object-stream>??
  • ??<com.zdp.domain.Student>??
  • ????<id>0</id>??
  • ????<name>jack</name>??
  • ??</com.zdp.domain.Student>??
  • ??<com.zdp.domain.Birthday>??
  • ????<birthday>2010-05-33</birthday>??
  • ??</com.zdp.domain.Birthday>??
  • ??<byte>22</byte>??
  • ??<boolean>true</boolean>??
  • ??<float>22.0</float>??
  • ??<string>hello</string>??
  • </object-stream>??
  • ?

    四. xml文檔轉為Java對象:

    1. 用inputStream將XML文檔轉換為Java對象

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?用InputStream將XML文檔轉換成java對象??
  • ?????*/??
  • ????@Test??
  • ????public?void?readXML4InputStream()?{??
  • ????????try?{??
  • ????????????String?s?=?"<object-stream><com.zdp.domain.Student><id>0</id><name>jack</name>"?+??
  • ??????????????"</com.zdp.domain.Student><com.zdp.domain.Birthday><birthday>2010-05-33</birthday>"?+??
  • ??????????????"</com.zdp.domain.Birthday><byte>22</byte><boolean>true</boolean><float>22.0</float>"?+??
  • ??????????????"<string>hello</string></object-stream>";??
  • ????????????highLight("======?ObjectInputStream##?XML?-->?javaObject?======");??
  • ????????????StringReader?reader?=?new?StringReader(s);??
  • ????????????in?=?xstream.createObjectInputStream(reader);??
  • ????????????Student?stu?=?(Student)?in.readObject();??
  • ????????????Birthday?b?=?(Birthday)?in.readObject();??
  • ????????????byte?i?=?in.readByte();??
  • ????????????boolean?bo?=?in.readBoolean();??
  • ????????????float?f?=?in.readFloat();??
  • ????????????String?str?=?in.readUTF();??
  • ????????????System.out.println(stu);??
  • ????????????System.out.println(b);??
  • ????????????System.out.println(i);??
  • ????????????System.out.println(bo);??
  • ????????????System.out.println(f);??
  • ????????????System.out.println(str);??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    ?

    ?

    [html]?view plaincopy
  • ======?ObjectInputStream##?XML?-->?javaObject?======??
  • jack#0#null#null#null??
  • com.zdp.domain.Birthday@27391d??
  • 22??
  • true??
  • 22.0??
  • hello??

  • 2. 將XML文檔轉為Java對象:

    ?

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?將XML文檔轉換成Java對象?
  • ?????*/??
  • ????@Test??
  • ????public?void?readXml2Object()?{??
  • ????????try?{??
  • ????????????highLight("======?Xml?>>>?Bean?======");??
  • ????????????Student?stu?=?(Student)?xstream.fromXML(xstream.toXML(student));??
  • ????????????print(stu.toString());??
  • ??????????????
  • ????????????List<Student>?list?=?new?ArrayList<Student>();??
  • ????????????list.add(student);//add??
  • ??????????????
  • ????????????Map<String,?Student>?map?=?new?HashMap<String,?Student>();??
  • ????????????map.put("No.1",?student);//put??
  • ??????????????
  • ????????????student?=?new?Student();??
  • ????????????student.setAddress("china");??
  • ????????????student.setEmail("tom@125.com");??
  • ????????????student.setId(2);??
  • ????????????student.setName("tom");??
  • ????????????Birthday?day?=?new?Birthday("2010-11-22");??
  • ????????????student.setBirthday(day);??
  • ????????????list.add(student);//add??
  • ????????????map.put("No.2",?student);//put??
  • ??????????????
  • ????????????student?=?new?Student();??
  • ????????????student.setName("jack");??
  • ????????????list.add(student);//add??
  • ????????????map.put("No.3",?student);//put??
  • ??????????????
  • ????????????highLight("======?XML?>>>?List?======");???
  • ????????????List<Student>?studetns?=?(List<Student>)?xstream.fromXML(xstream.toXML(list));??
  • ????????????print("size:"?+?studetns.size());//3??
  • ????????????for?(Student?s?:?studetns)?{??
  • ????????????????print(s.toString());??
  • ????????????}??
  • ??????????????
  • ????????????highLight("======?XML?>>>?Map?======");??
  • ????????????Map<String,?Student>?maps?=?(Map<String,?Student>)?xstream.fromXML(xstream.toXML(map));??
  • ????????????print("size:"?+?maps.size());//3??
  • ????????????Set<String>?key?=?maps.keySet();??
  • ????????????Iterator<String>?iter?=?key.iterator();??
  • ????????????while?(iter.hasNext())?{??
  • ????????????????String?k?=?iter.next();??
  • ????????????????print(k?+?":"?+?map.get(k));??
  • ????????????}??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • 運行結果:

    ?

    ?

    [html]?view plaincopy
  • ======?Xml?>>>?Bean?======??
  • jack#1#china#com.zdp.domain.Birthday@1125127#jack@email.com??
  • ======?XML?>>>?List?======??
  • size:3??
  • jack#1#china#com.zdp.domain.Birthday@134bed0#jack@email.com??
  • tom#2#china#com.zdp.domain.Birthday@1db4f6f#tom@125.com??
  • jack#0#null#null#null??
  • ======?XML?>>>?Map?======??
  • size:3??
  • No.3:jack#0#null#null#null??
  • No.1:jack#1#china#com.zdp.domain.Birthday@1d520c4#jack@email.com??
  • No.2:tom#2#china#com.zdp.domain.Birthday@2a5330#tom@125.com??

  • 五. xStream對JSON的支持:

    ?

    xStream對JSON也有非常好的支持,它提供了2個模型驅動。用這2個驅動可以完成Java對象到JSON的相互轉換。使用JettisonMappedXmlDriver驅動,將Java對象轉換成json,需要添加jettison.jar

    1.?用JettisonMappedXmlDriver完成Java對象到JSON的轉換

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?XStream結合JettisonMappedXmlDriver驅動,轉換Java對象到JSON?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeEntity2JETTSON()?{??
  • ????????highLight("======?JettisonMappedXmlDriver?===?JavaObject?>>>>?JaonString?======");??
  • ????????xstream?=?new?XStream(new?JettisonMappedXmlDriver());??
  • ????????xstream.setMode(XStream.NO_REFERENCES);??
  • ????????xstream.alias("student",?Student.class);??
  • ????????print(xstream.toXML(student));??
  • ????}??
  • 運行結果:

    ?

    ?

    [plain]?view plaincopy
  • ======?JettisonMappedXmlDriver?===?JavaObject?>>>>?JaonString?======??
  • {"student":{"id":1,"name":"jack","email":"jack@email.com","address":"china","birthday":[{},"2010-11-22"]}}??

  • ?

    2. 用JsonHierarchicalStreamDriver完成Java對象到JSON的轉換

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?轉換java對象為JSON字符串?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeEntiry2JSON()?{??
  • ????????highLight("======?JsonHierarchicalStreamDriver?===?JavaObject?>>>>?JaonString?======");??
  • ????????xstream?=?new?XStream(new?JsonHierarchicalStreamDriver());??
  • ????????xstream.alias("student",?Student.class);??
  • ????????highLight("-------Object?>>>>?JSON---------");??
  • ????????print(xstream.toXML(student));??
  • ??????????
  • ????????//刪除根節點??
  • ????????xstream?=?new?XStream(new?JsonHierarchicalStreamDriver()?{??
  • ????????????public?HierarchicalStreamWriter?createWriter(Writer?out)?{??
  • ????????????????return?new?JsonWriter(out,?JsonWriter.DROP_ROOT_MODE);??
  • ????????????}??
  • ????????});??
  • ??????????
  • ????????xstream.alias("student",?Student.class);??
  • ????????print(xstream.toXML(student));??
  • ????}??
  • 運行結果:

    ?

    ?

    [plain]?view plaincopy
  • ======?JsonHierarchicalStreamDriver?===?JavaObject?>>>>?JaonString?======??
  • -------Object?>>>>?JSON---------??
  • {"student":?{??
  • ??"id":?1,??
  • ??"name":?"jack",??
  • ??"email":?"jack@email.com",??
  • ??"address":?"china",??
  • ??"birthday":?{??
  • ????"birthday":?"2010-11-22"??
  • ??}??
  • }}??
  • {??
  • ??"id":?1,??
  • ??"name":?"jack",??
  • ??"email":?"jack@email.com",??
  • ??"address":?"china",??
  • ??"birthday":?{??
  • ????"birthday":?"2010-11-22"??
  • ??}??
  • }??
  • ?

    使用JsonHierarchicalStreamDriver轉換默認會給轉換后的對象添加一個根節點,但是在構建JsonHierarchicalStreamDriver驅動的時候,

    你可以重寫createWriter方法,刪掉根節點。

    ?

    3.?將List集合轉換成JSON串

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?將List集合轉換成JSON字符串?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeList2JSON()?{??
  • ????????highLight("=====?JsonHierarchicalStreamDriver?====?JavaObject?>>>>?JaonString?=====");??
  • ????????JsonHierarchicalStreamDriver?driver?=?new?JsonHierarchicalStreamDriver();??
  • ????????xstream?=?new?XStream(driver);??
  • ????????//?xstream?=?new?XStream(new?JettisonMappedXmlDriver());//轉換錯誤??
  • ????????//?xstream.setMode(XStream.NO_REFERENCES);??
  • ????????xstream.alias("student",?Student.class);??
  • ??????????
  • ????????List<Student>?list?=?new?ArrayList<Student>();??
  • ????????list.add(student);??
  • ??????????
  • ????????student?=?new?Student();??
  • ????????student.setAddress("china");??
  • ????????student.setEmail("tom@125.com");??
  • ????????student.setId(2);??
  • ????????student.setName("tom");??
  • ????????Birthday?day?=?new?Birthday("2010-11-22");??
  • ????????student.setBirthday(day);??
  • ????????list.add(student);??
  • ??????????
  • ????????student?=?new?Student();??
  • ????????student.setName("jack");??
  • ????????list.add(student);??
  • ??????????
  • ????????print(xstream.toXML(list));??
  • ??????????
  • ????????//刪除根節點??
  • ????????xstream?=?new?XStream(new?JsonHierarchicalStreamDriver()?{??
  • ????????????public?HierarchicalStreamWriter?createWriter(Writer?out)?{??
  • ????????????????return?new?JsonWriter(out,?JsonWriter.DROP_ROOT_MODE);??
  • ????????????}??
  • ????????});??
  • ????????xstream.alias("student",?Student.class);??
  • ????????print(xstream.toXML(list));??
  • ????}??
  • 運行結果:

    ?

    ?

    [plain]?view plaincopy
  • =====?JsonHierarchicalStreamDriver?====?JavaObject?>>>>?JaonString?=====??
  • {"list":?[??
  • ??{??
  • ????"id":?1,??
  • ????"name":?"jack",??
  • ????"email":?"jack@email.com",??
  • ????"address":?"china",??
  • ????"birthday":?{??
  • ??????"birthday":?"2010-11-22"??
  • ????}??
  • ??},??
  • ??{??
  • ????"id":?2,??
  • ????"name":?"tom",??
  • ????"email":?"tom@125.com",??
  • ????"address":?"china",??
  • ????"birthday":?{??
  • ??????"birthday":?"2010-11-22"??
  • ????}??
  • ??},??
  • ??{??
  • ????"id":?0,??
  • ????"name":?"jack"??
  • ??}??
  • ]}??
  • [??
  • ??{??
  • ????"id":?1,??
  • ????"name":?"jack",??
  • ????"email":?"jack@email.com",??
  • ????"address":?"china",??
  • ????"birthday":?{??
  • ??????"birthday":?"2010-11-22"??
  • ????}??
  • ??},??
  • ??{??
  • ????"id":?2,??
  • ????"name":?"tom",??
  • ????"email":?"tom@125.com",??
  • ????"address":?"china",??
  • ????"birthday":?{??
  • ??????"birthday":?"2010-11-22"??
  • ????}??
  • ??},??
  • ??{??
  • ????"id":?0,??
  • ????"name":?"jack"??
  • ??}??
  • ]??

  • ?

    4. 將Map轉換成json串:

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?將Map集合轉換成JSON字符串?
  • ?????*/??
  • ????@Test??
  • ????public?void?writeMap2JSON()?{??
  • ????????highLight("====?JsonHierarchicalStreamDriver?====?Map?>>>>?JaonString?=====");??
  • ????????xstream?=?new?XStream(new?JsonHierarchicalStreamDriver());??
  • ????????xstream.alias("student",?Student.class);??
  • ??????????
  • ????????Map<String,?Student>?map?=?new?HashMap<String,?Student>();??
  • ????????map.put("No.1",?student);??
  • ??????????
  • ????????student?=?new?Student();??
  • ????????student.setAddress("china");??
  • ????????student.setEmail("tom@125.com");??
  • ????????student.setId(2);??
  • ????????student.setName("tom");??
  • ????????student.setBirthday(new?Birthday("2010-11-21"));??
  • ????????map.put("No.2",?student);??
  • ??????????
  • ????????student?=?new?Student();??
  • ????????student.setName("jack");??
  • ????????map.put("No.3",?student);??
  • ??????????
  • ????????print(xstream.toXML(map));??
  • ??????????
  • ????????//刪除根節點??
  • ????????xstream?=?new?XStream(new?JsonHierarchicalStreamDriver()?{??
  • ????????????public?HierarchicalStreamWriter?createWriter(Writer?out)?{??
  • ????????????????return?new?JsonWriter(out,?JsonWriter.DROP_ROOT_MODE);??
  • ????????????}??
  • ????????});??
  • ????????xstream??
  • 運行結果:

    ?

    ?

    [plain]?view plaincopy
  • ====?JsonHierarchicalStreamDriver?====?Map?>>>>?JaonString?=====??
  • {"map":?[??
  • ??[??
  • ????"No.3",??
  • ????{??
  • ??????"id":?0,??
  • ??????"name":?"jack"??
  • ????}??
  • ??],??
  • ??[??
  • ????"No.1",??
  • ????{??
  • ??????"id":?1,??
  • ??????"name":?"jack",??
  • ??????"email":?"jack@email.com",??
  • ??????"address":?"china",??
  • ??????"birthday":?{??
  • ????????"birthday":?"2010-11-22"??
  • ??????}??
  • ????}??
  • ??],??
  • ??[??
  • ????"No.2",??
  • ????{??
  • ??????"id":?2,??
  • ??????"name":?"tom",??
  • ??????"email":?"tom@125.com",??
  • ??????"address":?"china",??
  • ??????"birthday":?{??
  • ????????"birthday":?"2010-11-21"??
  • ??????}??
  • ????}??
  • ??]??
  • ]}??
  • [??
  • ??[??
  • ????"No.3",??
  • ????{??
  • ??????"id":?0,??
  • ??????"name":?"jack"??
  • ????}??
  • ??],??
  • ??[??
  • ????"No.1",??
  • ????{??
  • ??????"id":?1,??
  • ??????"name":?"jack",??
  • ??????"email":?"jack@email.com",??
  • ??????"address":?"china",??
  • ??????"birthday":?{??
  • ????????"birthday":?"2010-11-22"??
  • ??????}??
  • ????}??
  • ??],??
  • ??[??
  • ????"No.2",??
  • ????{??
  • ??????"id":?2,??
  • ??????"name":?"tom",??
  • ??????"email":?"tom@125.com",??
  • ??????"address":?"china",??
  • ??????"birthday":?{??
  • ????????"birthday":?"2010-11-21"??
  • ??????}??
  • ????}??
  • ??]??
  • ]??
  • ?

    ?

    5. 將JSON轉換成Java對象:

    ?

    [java]?view plaincopy
  • /**?
  • ?????*?將JSON字符串轉換成java對象?
  • ?????*/??
  • ????@Test??
  • ????public?void?readJSON2Object()?throws?JSONException?{??
  • ????????String?json?=?"{student:?{"?+??
  • ????????????"id:?1,"?+??
  • ????????????"name:?haha,"?+??
  • ????????????"email:?email,"?+??
  • ????????????"address:?address,"?+??
  • ????????????"birthday:?{"?+??
  • ???????????????"birthday:?2010-11-22?"?+??
  • ????????????"}"?+??
  • ????????"}}";??
  • ????????xstream?=?new?XStream(new?JettisonMappedXmlDriver());??
  • ????????xstream.alias("student",?Student.class);??
  • ????????print(xstream.fromXML(json).toString());??
  • ??????????
  • ????????json?=?"{list:?[{"?+??
  • ????????????????????"id:?1,"?+??
  • ????????????????????"name:?haha,"?+??
  • ????????????????????"email:?email,"?+??
  • ????????????????????"address:?address,"?+??
  • ????????????????????"birthday:?{"?+??
  • ??????????????????????"birthday:?2010-11-22"?+??
  • ????????????????????"}"?+??
  • ???????????????"},{"?+??
  • ????????????????????"id:?2,"?+??
  • ????????????????????"name:?tom,"?+??
  • ????????????????????"email:?tom@125.com,"?+??
  • ????????????????????"address:?china,"?+??
  • ????????????????????"birthday:?{"?+??
  • ??????????????????????"birthday:?2010-11-22"?+??
  • ????????????????????"}"?+??
  • ?????????????????"}"?+??
  • ??????????????"]}";??
  • ????????System.out.println(json);???
  • ????????List?list?=?(List)?xstream.fromXML(json);??
  • ????????System.out.println(list.size());??
  • ????}??
  • 運行結果:

    ?

    ?

    [plain]?view plaincopy
  • haha#1#address#com.zdp.domain.Birthday@137c60d#email??
  • {list:?[{id:?1,name:?haha,email:?email,address:?address,birthday:?{birthday:?2010-11-22}},{id:?2,name:?tom,email:?tom@125.com,address:?china,birthday:?{birthday:?2010-11-22}}]}??
  • 0??
  • ?

    ?

    三. 遇到的問題

    1. 如何加上xml頭部?即<?xml version="1.0" encoding="UTF-8"?>

    官方文檔是這樣解釋的:

    Why does XStream not write an XML declaration?
    XStream is designed to write XML snippets, so you can embed its output into an existing stream or string.?

    You can write the XML declaration yourself into the Writer before using it to call XStream.toXML(writer).

    我們可以自己添加:XmlDeclarationXStream

    ?

    [java]?view plaincopy
  • public?class?XmlDeclarationXStream?extends?XStream?{??
  • ????private?String?version;??
  • ??
  • ????private?String?ecoding;??
  • ??
  • ????public?XmlDeclarationXStream()?{??
  • ????????this("1.0",?"utf-8");??
  • ????}??
  • ??
  • ????public?XmlDeclarationXStream(String?version,?String?ecoding)?{??
  • ????????this.version?=?version;??
  • ????????this.ecoding?=?ecoding;??
  • ????}??
  • ??
  • ????public?String?getDeclaration()?{??
  • ????????return?"<?xml?version=\""?+?this.version?+?"\"?encoding=\""?+?this.ecoding?+?"\"?>";??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?toXML(Object?obj,?OutputStream?output)?{???
  • ????????try?{??
  • ????????????String?dec?=?this.getDeclaration();??
  • ????????????byte[]?bytesOfDec?=?dec.getBytes(this.ecoding);??
  • ????????????output.write(bytesOfDec);??
  • ????????}?catch?(Exception?e)?{??
  • ????????????throw?new?RuntimeException("error?happens",?e);??
  • ????????}??
  • ????????super.toXML(obj,?output);??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?toXML(Object?obj,?Writer?writer)?{??
  • ????????try?{??
  • ????????????writer.write(getDeclaration());???
  • ????????}?catch?(Exception?e)?{??
  • ????????????throw?new?RuntimeException("error?happens",?e);??
  • ????????}??
  • ????????super.toXML(obj,?writer);??
  • ????}??
  • }??
  • 測試的時候我們new這個類:XStream xstream = new XmlDeclarationXStream();

    ?

    源碼下載:http://download.csdn.net/detail/zdp072/7866129

    原文:http://blog.csdn.net/IBM_hoojo/article/details/6342386

    ?

    ?

    轉載于:https://www.cnblogs.com/zengda/p/4302473.html

    總結

    以上是生活随笔為你收集整理的xStream转换XML、JSON的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。