生活随笔
收集整理的這篇文章主要介紹了
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;?? ???? ????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
????@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?======?? <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>?? <student>?? ??<id>1</id>?? ??<name>jack</name>?? ??<郵件>jack@email.com</郵件>?? ??<address>china</address>?? ??<生日>?? ????<生日>2010-11-22</生日>?? ??</生日>?? </student>?? 第一份文檔是沒有經過修改或重命名的文檔, 按照原樣輸出。
第二份文檔的類、屬性、包都經過了重命名。
?
2. 將List集合轉成xml文檔:
[java] ?view plaincopy
????@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>();?? ???????????? ????????????list.add(student);?? ????????????list.add(student);??? ???????????? ?? ????????????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);?? ?????????????? ???????????? ???????????? ?????????????? ???????????? ????????????xstream.setMode(XStream.ID_REFERENCES);? ???????????? ???????????? ?????????????? ???????????? ????????????xstream.useAttributeFor(Student.class,?"name");?? ????????????xstream.useAttributeFor(Birthday.class,?"birthday");?? ?????????????? ???????????? ????????????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
????@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
????@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
????@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); ????????????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
????@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
????@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); ?????????????? ????????????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);?? ????????????list.add(student); ????????????map.put("No.2",?student); ?????????????? ????????????student?=?new?Student();?? ????????????student.setName("jack");?? ????????????list.add(student); ????????????map.put("No.3",?student); ?????????????? ????????????highLight("======?XML?>>>?List?======");??? ????????????List<Student>?studetns?=?(List<Student>)?xstream.fromXML(xstream.toXML(list));?? ????????????print("size:"?+?studetns.size()); ????????????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()); ????????????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
????@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
????@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
????@Test?? ????public?void?writeList2JSON()?{?? ????????highLight("=====?JsonHierarchicalStreamDriver?====?JavaObject?>>>>?JaonString?=====");?? ????????JsonHierarchicalStreamDriver?driver?=?new?JsonHierarchicalStreamDriver();?? ????????xstream?=?new?XStream(driver);?? ???????? ???????? ????????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
????@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
????@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 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。