日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)javascript|JQuery → xStream框架完美實(shí)現(xiàn)Java對象和xml文檔JSON、XML相互轉(zhuǎn)換

      xStream框架完美實(shí)現(xiàn)Java對象和xml文檔JSON、XML相互轉(zhuǎn)換

      前往專題相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時(shí)間:2011/4/23 6:05:59字體大。A-A+

      作者:西西點(diǎn)擊:3727次評論:2次標(biāo)簽: JSON XML Java

      • 類型:行業(yè)軟件大小:382M語言:中文 評分:10.0
      • 標(biāo)簽:
      立即下載

      xStream框架
      xStream可以輕易的將Java對象和xml文檔相互轉(zhuǎn)換,而且可以修改某個(gè)特定的屬性和節(jié)點(diǎn)名稱,而且也支持json的轉(zhuǎn)換; 它們都完美支持JSON,但是對xml的支持還不是很好。一定程度上限制了對Java對象的描述,不能讓xml完全體現(xiàn)到對Java對象的描述。這里將會介紹xStream對JSON、XML的完美支持。xStream不僅對XML的轉(zhuǎn)換非常友好,而且提供annotation注解,可以在JavaBean中完成對xml節(jié)點(diǎn)、屬性的描述。以及對JSON也支持,只需要提供相關(guān)的JSONDriver就可以完成轉(zhuǎn)換。

      一、準(zhǔn)備工作

      1、 下載jar包、及官方資源

      xStream的jar下載地址:

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

      官方的示例很全,官方參考示例:http://xstream.codehaus.org/tutorial.html

      添加xstream-1.3.1.jar文件到工程中,就可以開始下面的工作;需要的jar如下:

      2、 測試用例代碼

      package com.hoo.test;
       
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.io.StringReader;
      import java.io.Writer;
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.Iterator;
      import java.util.List;
      import java.util.Map;
      import java.util.Set;
      import org.codehaus.jettison.json.JSONException;
      import org.junit.After;
      import org.junit.Before;
      import org.junit.Test;
      import com.hoo.entity.Birthday;
      import com.hoo.entity.Classes;
      import com.hoo.entity.ListBean;
      import com.hoo.entity.Student;
      import com.thoughtworks.xstream.XStream;
      import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
      import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
      import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
      import com.thoughtworks.xstream.io.json.JsonWriter;
       
      /**
       * <b>function:</b>Java對象和XML字符串的相互轉(zhuǎn)換
       * jar-lib-version: xstream-1.3.1
       * @author hoojo
       * @createDate Nov 27, 2010 12:15:15 PM
       * @file XStreamTest.java
       * @package com.hoo.test
       * @project WebHttpUtils
       * @blog http://blog.csdn.net/IBM_hoojo
       * @email hoojo_@126.com
       * @version 1.0
       */
      @SuppressWarnings("unchecked")
      public class XStreamTest {
          
          private XStream xstream = null;
          private ObjectOutputStream  out = null;
          private ObjectInputStream in = null;
          
          private Student bean = null;
          
          /**
           * <b>function:</b>初始化資源準(zhǔn)備
           * @author hoojo
           * @createDate Nov 27, 2010 12:16:28 PM
           */
          @Before
          public void init() {
              try {
                  xstream = new XStream();
                  //xstream = new XStream(new DomDriver()); // 需要xpp3 jar
              } catch (Exception e) {
                  e.printStackTrace();
              }
              bean = new Student();
              bean.setAddress("china");
              bean.setEmail("jack@email.com");
              bean.setId(1);
              bean.setName("jack");
              Birthday day = new Birthday();
              day.setBirthday("2010-11-22");
              bean.setBirthday(day);
          }
          
          /**
           * <b>function:</b>釋放對象資源
           * @author hoojo
           * @createDate Nov 27, 2010 12:16:38 PM
           */
          @After
          public void destory() {
              xstream = null;
              bean = null;
              try {
                  if (out != null) {
                      out.flush();
                      out.close();
                  }
                  if (in != null) {
                      in.close();
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
              System.gc();
          }
          
          public final void fail(String string) {
              System.out.println(string);
          }
          
          public final void failRed(String string) {
              System.err.println(string);
          }
      }


      通過XStream對象的toXML方法就可以完成Java對象到XML的轉(zhuǎn)換,toXML方法還有2個(gè)相同簽名的方法,需要傳遞一個(gè)流。然后通過流來完成xml信息的輸出。

      3、 需要的JavaBean

      package com.hoo.entity;
       
      public class Student {
          private int id;
          private String name;
          private String email;
          private String address;
          private Birthday birthday;
          //getter、setter
          public String toString() {
              return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
          }
      }


      二、Java轉(zhuǎn)換成XML

      1、 JavaBean轉(zhuǎn)換XM

      /**
       * <b>function:</b>Java對象轉(zhuǎn)換成XML字符串
       * @author hoojo
       * @createDate Nov 27, 2010 12:19:01 PM
       */
      @Test
      public void writeBean2XML() {
          try {
              fail("------------Bean->XML------------");
              fail(xstream.toXML(bean));
              fail("重命名后的XML");
              //類重命名
              //xstream.alias("account", Student.class);
              //xstream.alias("生日", Birthday.class);
              //xstream.aliasField("生日", Student.class, "birthday");
              //xstream.aliasField("生日", Birthday.class, "birthday");
              //fail(xstream.toXML(bean));
              //屬性重命名
              xstream.aliasField("郵件", Student.class, "email");
              //包重命名
              xstream.aliasPackage("hoo", "com.hoo.entity");
              fail(xstream.toXML(bean));
          } catch (Exception e) {
              e.printStackTrace();
          }
      }


      看結(jié)果中的第一份xml內(nèi)容,是沒有經(jīng)過然后修改或重命名的文檔,按照原樣輸出。文檔中的第二份文檔的package經(jīng)過重命名,email屬性也經(jīng)過重命名以及類名也可以進(jìn)行重命名的。

      運(yùn)行后結(jié)果如下:

      ------------Bean->XML------------
      <com.hoo.entity.Student>
        <id>1</id>
        <name>jack</name>
        <email>jack@email.com</email>
        <address>china</address>
        <birthday>
          <birthday>2010-11-22</birthday>
        </birthday>
      </com.hoo.entity.Student>
      重命名后的XML
      <hoo.Student>
        <id>1</id>
        <name>jack</name>
        <郵件>jack@email.com</郵件>
        <address>china</address>
        <birthday>
          <birthday>2010-11-22</birthday>
        </birthday>
      </hoo.Student>


      2、 將List集合轉(zhuǎn)換成xml文檔

      /**
       * <b>function:</b>將Java的List集合轉(zhuǎn)換成XML對象
       * @author hoojo
       * @createDate Nov 27, 2010 12:20:07 PM
       */
      @Test
      public void writeList2XML() {
          try {
              //修改元素名稱
              xstream.alias("beans", ListBean.class);
              xstream.alias("student", Student.class);
              fail("----------List-->XML----------");
              ListBean listBean = new ListBean();
              listBean.setName("this is a List Collection");
              
              List<Object> list = new ArrayList<Object>();
              list.add(bean);
              list.add(bean);//引用bean
              //list.add(listBean);//引用listBean,父元素
              
              bean = new Student();
              bean.setAddress("china");
              bean.setEmail("tom@125.com");
              bean.setId(2);
              bean.setName("tom");
              Birthday day = new Birthday("2010-11-22");
              bean.setBirthday(day);
              
              list.add(bean);
              listBean.setList(list);
              
              //將ListBean中的集合設(shè)置空元素,即不顯示集合元素標(biāo)簽
              //xstream.addImplicitCollection(ListBean.class, "list");
              
              //設(shè)置reference模型
              //xstream.setMode(XStream.NO_REFERENCES);//不引用
              xstream.setMode(XStream.ID_REFERENCES);//id引用
              //xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);//絕對路徑引用
                
              //將name設(shè)置為父類(Student)的元素的屬性
              xstream.useAttributeFor(Student.class, "name");
              xstream.useAttributeFor(Birthday.class, "birthday");
              //修改屬性的name
              xstream.aliasAttribute("姓名", "name");
              xstream.aliasField("生日", Birthday.class, "birthday");
            
              fail(xstream.toXML(listBean));
          } catch (Exception e) {
              e.printStackTrace();
          }
      }


      上面的代碼運(yùn)行后,結(jié)果如下:

      ----------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>


      如果不加xstream.addImplicitCollection(ListBean.class, "list");

      這個(gè)設(shè)置的話,會出現(xiàn)一個(gè)List節(jié)點(diǎn)包裹著Student節(jié)點(diǎn)元素。添加addImplicitCollection可以忽略這個(gè)list節(jié)點(diǎn)元素。那么上面的list節(jié)點(diǎn)就不存在,只會在beans元素中出現(xiàn)name、student這2個(gè)xml元素標(biāo)簽;

      setMode是設(shè)置相同的對象的引用方式,如果設(shè)置XStream.NO_REFERENCES就是不引用,會輸出2分相同的Student元素。如果是XStream.ID_REFERENCES會引用相同的那個(gè)對象的id屬性,如果是XStream.XPATH_ABSOLUTE_REFERENCES引用,那么它將顯示xpath路徑。上面采用的id引用,<student reference="3"/>這個(gè)引用了id=3的那個(gè)student標(biāo)簽元素;

      useAttributeFor是設(shè)置某個(gè)節(jié)點(diǎn)顯示到父節(jié)點(diǎn)的屬性中,也就是將指定class中的指定屬性,在這個(gè)class元素節(jié)點(diǎn)的屬性中顯示。

      如:<student><name>hoojo</name></student>

      設(shè)置好后就是這樣的結(jié)果:<student name=”hoojo”></student>

      aliasAttribute是修改屬性名稱。

      3、 在JavaBean中添加Annotation注解進(jìn)行重命名設(shè)置

      先看看JavaBean的代碼

      package com.hoo.entity;
       
      import java.util.Arrays;
      import java.util.Calendar;
      import java.util.GregorianCalendar;
      import java.util.List;
      import com.thoughtworks.xstream.annotations.XStreamAlias;
      import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
      import com.thoughtworks.xstream.annotations.XStreamConverter;
      import com.thoughtworks.xstream.annotations.XStreamImplicit;
      import com.thoughtworks.xstream.annotations.XStreamOmitField;
       
      @XStreamAlias("class")
      public class Classes {
          
          /*
           * 設(shè)置屬性顯示
           */
          @XStreamAsAttribute
          @XStreamAlias("名稱")
          private String name;
          
          /*
           * 忽略
           */
          @XStreamOmitField
          private int number;
          
          @XStreamImplicit(itemFieldName = "Students")
          private List<Student> students;
          
          @SuppressWarnings("unused")
          @XStreamConverter(SingleValueCalendarConverter.class)
          private Calendar created = new GregorianCalendar();
       
          
          public Classes(){}
          public Classes(String name, Student... stu) {
              this.name = name;
              this.students = Arrays.asList(stu);
          }
          //getter、setter
      }


      SingleValueCalendarConverter.java這個(gè)是一個(gè)類型轉(zhuǎn)換器

      package com.hoo.entity;
       
      import java.util.Calendar;
      import java.util.Date;
      import java.util.GregorianCalendar;
      import com.thoughtworks.xstream.converters.Converter;
      import com.thoughtworks.xstream.converters.MarshallingContext;
      import com.thoughtworks.xstream.converters.UnmarshallingContext;
      import com.thoughtworks.xstream.io.HierarchicalStreamReader;
      import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
       
      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;
              }
       
              @SuppressWarnings("unchecked")
              public boolean canConvert(Class type) {
                  return type.equals(GregorianCalendar.class);
              }
      }


      再看看測試用例代碼

      @Test
      public void writeList2XML4Annotation() {
          try {
              failRed("---------annotation Bean --> XML---------");
              Student stu = new Student();
              stu.setName("jack");
              Classes c = new Classes("一班", bean, stu);
              c.setNumber(2);
              //對指定的類使用Annotation
              //xstream.processAnnotations(Classes.class);
              //啟用Annotation
              //xstream.autodetectAnnotations(true);
              xstream.alias("student", Student.class);
              fail(xstream.toXML(c));
          } catch (Exception e) {
              e.printStackTrace();
          }
      }


      當(dāng)啟用annotation或是對某個(gè)特定的類啟用annotation時(shí),上面的classes這個(gè)類才有效果。如果不啟用annotation,運(yùn)行后結(jié)果如下:

      ---------annotation Bean --> XML---------
      <com.hoo.entity.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>1303292056718</time>
          <timezone>Asia/Shanghai</timezone>
        </created>
      </com.hoo.entity.Classes>


      當(dāng)啟用annotation后xstream.processAnnotations(Classes.class),結(jié)果如下:

      ---------annotation Bean --> XML---------
      <class 名稱="一班">
        <Students>
          <id>1</id>
          <name>jack</name>
          <email>jack@email.com</email>
          <address>china</address>
          <birthday>
            <birthday>2010-11-22</birthday>
          </birthday>
        </Students>
        <Students>
          <id>0</id>
          <name>jack</name>
        </Students>
        <created>1303292242937</created>
      </class>


      4、 Map集合轉(zhuǎn)換xml文檔

      /**
       * <b>function:</b>Java Map集合轉(zhuǎn)XML
       * @author hoojo
       * @createDate Nov 27, 2010 1:13:26 PM
       */
      @Test
      public void writeMap2XML() {
          try {
              failRed("---------Map --> XML---------");
              Map<String, Student> map = new HashMap<String, Student>();
              map.put("No.1", bean);//put
              
              bean = new Student();
              bean.setAddress("china");
              bean.setEmail("tom@125.com");
              bean.setId(2);
              bean.setName("tom");
              Birthday day = new Birthday("2010-11-22");
              bean.setBirthday(day);
              map.put("No.2", bean);//put
              
              bean = new Student();
              bean.setName("jack");
              map.put("No.3", bean);//put
              
              xstream.alias("student", Student.class);
              xstream.alias("key", String.class);
              xstream.useAttributeFor(Student.class, "id");
              xstream.useAttributeFor("birthday", String.class);
              fail(xstream.toXML(map));
          } catch (Exception e) {
              e.printStackTrace();
          }
      }


      運(yùn)行后結(jié)果如下:

      ---------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

      /**
       * <b>function:</b>用OutStream輸出流寫XML
       * @author hoojo
       * @createDate Nov 27, 2010 1:13:48 PM
       */
      @Test
      public void writeXML4OutStream() {
          try {
              out = xstream.createObjectOutputStream(System.out);
              Student stu = new Student();
              stu.setName("jack");
              Classes c = new Classes("一班", bean, stu);
              c.setNumber(2);
              failRed("---------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();
          }
      }


      使用輸出流后,可以通過流對象完成xml的構(gòu)建,即使沒有JavaBean對象,你可以用流來構(gòu)建一個(gè)復(fù)雜的xml文檔,運(yùn)行后結(jié)果如下:

      ---------ObjectOutputStream # JavaObject--> XML---------
      <object-stream>
        <com.hoo.entity.Student>
          <id>0</id>
          <name>jack</name>
        </com.hoo.entity.Student>
        <com.hoo.entity.Birthday>
          <birthday>2010-05-33</birthday>
        </com.hoo.entity.Birthday>
        <byte>22</byte>
        <boolean>true</boolean>
        <float>22.0</float>
        <string>hello</string>
      </object-stream>


      三、XML內(nèi)容轉(zhuǎn)換Java對象

      1、 用InputStream將XML文檔轉(zhuǎn)換成java對象

      /**
       * <b>function:</b>用InputStream將XML文檔轉(zhuǎn)換成java對象
       * 需要額外的jar xpp3-main.jar
       * @author hoojo
       * @createDate Nov 27, 2010 1:14:52 PM
       */
      @Test
      public void readXML4InputStream() {
          try {
              String s = "<object-stream><com.hoo.entity.Student><id>0</id><name>jack</name>" +
                "</com.hoo.entity.Student><com.hoo.entity.Birthday><birthday>2010-05-33</birthday>" +
                "</com.hoo.entity.Birthday><byte>22</byte><boolean>true</boolean><float>22.0</float>" +
                "<string>hello</string></object-stream>";
              failRed("---------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();
          }
      }


      讀取后,轉(zhuǎn)換的Java對象,結(jié)果如下:

      ---------ObjectInputStream## XML --> javaObject---------
      jack#0#null#null#null
      2010-05-33
      22
      true
      22.0
      hello


      2、 將xml文檔轉(zhuǎn)換成Java對象

      /**
       * <b>function:</b>將XML字符串轉(zhuǎn)換成Java對象
       * @author hoojo
       * @createDate Nov 27, 2010 2:39:06 PM
       */
      @Test
      public void readXml2Object() {
          try {
              failRed("-----------Xml >>> Bean--------------");
              Student stu = (Student) xstream.fromXML(xstream.toXML(bean));
              fail(stu.toString());
              
              List<Student> list = new ArrayList<Student>();
              list.add(bean);//add
              
              Map<String, Student> map = new HashMap<String, Student>();
              map.put("No.1", bean);//put
              
              bean = new Student();
              bean.setAddress("china");
              bean.setEmail("tom@125.com");
              bean.setId(2);
              bean.setName("tom");
              Birthday day = new Birthday("2010-11-22");
              bean.setBirthday(day);
              list.add(bean);//add
              map.put("No.2", bean);//put
              
              bean = new Student();
              bean.setName("jack");
              list.add(bean);//add
              map.put("No.3", bean);//put
              
              failRed("==========XML >>> List===========");
              List<Student> studetns = (List<Student>) xstream.fromXML(xstream.toXML(list));
              fail("size:" + studetns.size());//3
              for (Student s : studetns) {
                  fail(s.toString());
              }
              
              failRed("==========XML >>> Map===========");
              Map<String, Student> maps = (Map<String, Student>) xstream.fromXML(xstream.toXML(map));
              fail("size:" + maps.size());//3
              Set<String> key = maps.keySet();
              Iterator<String> iter = key.iterator();
              while (iter.hasNext()) {
                  String k = iter.next();
                  fail(k + ":" + map.get(k));
              }
          } catch (Exception e) {
              e.printStackTrace();
          }
      }


      運(yùn)行后結(jié)果如下:

      -----------Xml >>> Bean--------------
      jack#1#china#2010-11-22#jack@email.com
      ==========XML >>> List===========
      size:3
      jack#1#china#2010-11-22#jack@email.com
      tom#2#china#2010-11-22#tom@125.com
      jack#0#null#null#null
      ==========XML >>> Map===========
      size:3
      No.3:jack#0#null#null#null
      No.1:jack#1#china#2010-11-22#jack@email.com
      No.2:tom#2#china#2010-11-22#tom@125.com


      怎么樣,成功的完成XML到JavaBean、List、Map的轉(zhuǎn)換,更多對象轉(zhuǎn)換還需要大家一一嘗試。用法類似~這里就不一樣贅述。

      四、XStream對JSON的支持

      xStream對JSON也有非常好的支持,它提供了2個(gè)模型驅(qū)動(dòng)。用這2個(gè)驅(qū)動(dòng)可以完成Java對象到JSON的相互轉(zhuǎn)換。使用JettisonMappedXmlDriver驅(qū)動(dòng),將Java對象轉(zhuǎn)換成json,需要添加jettison.jar

      1、 用JettisonMappedXmlDriver完成Java對象到JSON的轉(zhuǎn)換

      /**
       * <b>function:</b>XStream結(jié)合JettisonMappedXmlDriver驅(qū)動(dòng),轉(zhuǎn)換Java對象到JSON
       * 需要添加jettison jar
       * @author hoojo
       * @createDate Nov 27, 2010 1:23:18 PM
       */
      @Test
      public void writeEntity2JETTSON() {
          failRed("=======JettisonMappedXmlDriver===JavaObject >>>> JaonString=========");
          xstream = new XStream(new JettisonMappedXmlDriver());
          xstream.setMode(XStream.NO_REFERENCES);
          xstream.alias("student", Student.class);
          fail(xstream.toXML(bean));
      }


      運(yùn)行后結(jié)果如下:

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


      JSON的轉(zhuǎn)換和XML的轉(zhuǎn)換用法一樣,只是創(chuàng)建XStream需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)就是xml到JSON映射轉(zhuǎn)換的驅(qū)動(dòng)。這里會降到兩個(gè)驅(qū)動(dòng),分別是JettisonMappedXmlDriver、JsonHierarchicalStreamDriver。

      2、 JsonHierarchicalStreamDriver完成Java對象到JSON的轉(zhuǎn)換

      /**
       * <b>function:</b>用XStream結(jié)合JsonHierarchicalStreamDriver驅(qū)動(dòng)
       * 轉(zhuǎn)換java對象為JSON字符串
       * @author hoojo
       * @createDate Nov 27, 2010 1:16:46 PM
       */
      @Test
      public void writeEntiry2JSON() {
          failRed("======JsonHierarchicalStreamDriver====JavaObject >>>> JaonString=========");
          xstream = new XStream(new JsonHierarchicalStreamDriver());
          //xstream.setMode(XStream.NO_REFERENCES);
          xstream.alias("student", Student.class);
          failRed("-------Object >>>> JSON---------");
          fail(xstream.toXML(bean));
          
          //failRed("========JsonHierarchicalStreamDriver==刪除根節(jié)點(diǎn)=========");
          //刪除根節(jié)點(diǎn)
          xstream = new XStream(new JsonHierarchicalStreamDriver() {
              public HierarchicalStreamWriter createWriter(Writer out) {
                  return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
              }
          });
          //xstream.setMode(XStream.NO_REFERENCES);
          xstream.alias("student", Student.class);
          fail(xstream.toXML(bean));
      }


      運(yùn)行后結(jié)果如下:

      ======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轉(zhuǎn)換默認(rèn)會給轉(zhuǎn)換后的對象添加一個(gè)根節(jié)點(diǎn),但是在構(gòu)建JsonHierarchicalStreamDriver驅(qū)動(dòng)的時(shí)候,你可以重寫createWriter方法,刪掉根節(jié)點(diǎn)。

      看上面的結(jié)果,一個(gè)是默認(rèn)帶根節(jié)點(diǎn)的JSON對象,它只是將類名作為一個(gè)屬性,將對象作為該屬性的一個(gè)值。而另一個(gè)沒有帶根屬性的JSON就是通過重寫createWriter方法完成的。

      3、 將List集合轉(zhuǎn)換成JSON字符串

      @Test
      public void writeList2JSON() {
          failRed("======JsonHierarchicalStreamDriver====JavaObject >>>> JaonString=========");
          JsonHierarchicalStreamDriver driver = new JsonHierarchicalStreamDriver();
          xstream = new XStream(driver);
          //xstream = new XStream(new JettisonMappedXmlDriver());//轉(zhuǎn)換錯(cuò)誤
          //xstream.setMode(XStream.NO_REFERENCES);
          xstream.alias("student", Student.class);
          
          List<Student> list = new ArrayList<Student>();
          list.add(bean);//add
          
          bean = new Student();
          bean.setAddress("china");
          bean.setEmail("tom@125.com");
          bean.setId(2);
          bean.setName("tom");
          Birthday day = new Birthday("2010-11-22");
          bean.setBirthday(day);
          list.add(bean);//add
          
          bean = new Student();
          bean.setName("jack");
          list.add(bean);//add
          
          fail(xstream.toXML(list));
          
          //failRed("========JsonHierarchicalStreamDriver==刪除根節(jié)點(diǎn)=========");
          //刪除根節(jié)點(diǎn)
          xstream = new XStream(new JsonHierarchicalStreamDriver() {
              public HierarchicalStreamWriter createWriter(Writer out) {
                  return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
              }
          });
          xstream.alias("student", Student.class);
          fail(xstream.toXML(list));
      }


      運(yùn)行后結(jié)果如下

      ======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"
        }
      ]


      上面的list1是使用JsonHierarchicalStreamDriver 轉(zhuǎn)換的,當(dāng)然你也可以使用JettisonMappedXmlDriver驅(qū)動(dòng)進(jìn)行轉(zhuǎn)換;用JettisonMappedXmlDriver轉(zhuǎn)換后,你會發(fā)現(xiàn)格式不同而且沒有根屬性。

      4、 Map轉(zhuǎn)換json

      @Test
      public void writeMap2JSON() {
          failRed("======JsonHierarchicalStreamDriver==== Map >>>> JaonString=========");
          xstream = new XStream(new JsonHierarchicalStreamDriver());
          //xstream = new XStream(new JettisonMappedXmlDriver());
          xstream.alias("student", Student.class);
          
          Map<String, Student> map = new HashMap<String, Student>();
          map.put("No.1", bean);//put
          
          bean = new Student();
          bean.setAddress("china");
          bean.setEmail("tom@125.com");
          bean.setId(2);
          bean.setName("tom");
          bean.setBirthday(new Birthday("2010-11-21"));
          map.put("No.2", bean);//put
          
          bean = new Student();
          bean.setName("jack");
          map.put("No.3", bean);//put
          
          fail(xstream.toXML(map));
          
          //failRed("========JsonHierarchicalStreamDriver==刪除根節(jié)點(diǎn)=========");
          //刪除根節(jié)點(diǎn)
          xstream = new XStream(new JsonHierarchicalStreamDriver() {
              public HierarchicalStreamWriter createWriter(Writer out) {
                  return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
              }
          });
          xstream.alias("student", Student.class);
          fail(xstream.toXML(map));
      }


      運(yùn)行后結(jié)果如下:

      ======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轉(zhuǎn)換java對象

      /**
       * <b>function:</b>JsonHierarchicalStreamDriver可以將簡單的json字符串轉(zhuǎn)換成java對象,list、map轉(zhuǎn)換不成功;
       * JsonHierarchicalStreamDriver讀取JSON字符串到j(luò)ava對象出錯(cuò)
       * @author hoojo
       * @createDate Nov 27, 2010 1:22:26 PM
       * @throws JSONException
       */
      @Test
      public void readJSON2Object() throws JSONException {
          String json = "{\"student\": {" +
              "\"id\": 1," +
              "\"name\": \"haha\"," +
              "\"email\": \"email\"," +
              "\"address\": \"address\"," +
              "\"birthday\": {" +
                  "\"birthday\": \"2010-11-22\"" +
              "}" +
          "}}";
          //JsonHierarchicalStreamDriver讀取JSON字符串到j(luò)ava對象出錯(cuò),但JettisonMappedXmlDriver可以
          xstream = new XStream(new JettisonMappedXmlDriver());
          xstream.alias("student", Student.class);
          fail(xstream.fromXML(json).toString());
          
          //JettisonMappedXmlDriver轉(zhuǎn)換List集合出錯(cuò),但JsonHierarchicalStreamDriver可以轉(zhuǎn)換正確
          //JettisonMappedXmlDriver 轉(zhuǎn)換的字符串 {"list":{"student":[{"id":1,"name":"haha","email":"email","address":"address","birthday":[{},"2010-11-22"]}]},"student":{"id":2,"name":"tom","email":"tom@125.com","address":"china","birthday":[{},"2010-11-22"]}}
          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);//用js轉(zhuǎn)換成功
          List list = (List) xstream.fromXML(json);
          System.out.println(list.size());//0好像轉(zhuǎn)換失敗
      }


      運(yùn)行后結(jié)果如下:

      haha#1#address#2010-11-22#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


      JSON到Java的轉(zhuǎn)換是fromXML方法。

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(2)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)