Gson

来源:互联网 发布:js input 禁止光标 编辑:程序博客网 时间:2024/06/16 15:45
Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象。GSON核心jar包不到1M,非常精简,但提供的功能无疑是非常强大的,如果使用JDK自带的JSON解析API,使用起来相对比较繁琐一点,而且代码量较多。 

下面通过一个表格来了解一下,GSON目前的发展状况 
初始版本2008年5月22日最新版本(稳定版本)2.2.4/2013年5月13日;2个月前编程语言Java操作平台各种平台许可协议Apache License 2.0官方网站http://code.google.com/p/google-gson/下载地址http://code.google.com/p/google-gson/downloads/listGSON帮助文档http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

下图是,使用GSON转换时报的一个异常。 

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)      at com.google.gson.Gson.fromJson(Gson.java:803)      at com.google.gson.Gson.fromJson(Gson.java:768)      at com.google.gson.Gson.fromJson(Gson.java:717)      at com.google.gson.Gson.fromJson(Gson.java:689)      at com.demoone.UseGson.testOneBeanFromJSON(UseGson.java:54)      at com.demoone.UseGson.main(UseGson.java:89)  Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2   //注意这句话跟数组集合有关      at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)      ... 6 more  

下面贴出,笔者的测试源码,注意上述异常,在代码的注释中已经指出问题原因 

package com.demoone;    import java.util.ArrayList;  import java.util.List;    import com.entity.Person;  import com.google.gson.Gson;  import com.google.gson.reflect.*;    /***  *   * 使用gson  * 进行序列化,反序列化的操作  * json  *   * **/  public class UseGson {         static Gson g=new Gson();   /**   *    * 由集合类型的实体类   * 转换成Json类型   *    * **/      public static void testToJSON(){                List<Person> list=new ArrayList<>();                    for(int i=0;i<2;i++){           Person p=new Person(i, "散仙"+i, "北京市"+i, "54152541@qq.com", 500.0);              list.add(p);          }          String json=g.toJson(list);          System.out.println(json);                }            /**      * 由json转换为实体类      *       * */      public static void testOneBeanFromJSON(){          /**          * 转换一个Java Bean的时候          * 记住不能使用[],只有在使用集合的时候才可以使用           * 如上图贴的那个异常就是由此原因造成的,另外          * 格式要规范,中间不能出现空格字符          *           * **/          String jsonBean="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";           Person p=g.fromJson(jsonBean, Person.class);           System.out.println(p);         }            /**      * 由json转换为实体类集合      *       * */      public static void testListBeanFromJSON(){  
                   /**           * 转换一个集合 的实体Bean           * 注意前面加上[]方括号,代表一个数组           **/                String  jsonBeanList="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0},{\"id\":1,\"name\":\"散仙1\",\"address\":\"北京市1\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";                      List<Person> lists=g.fromJson(jsonBeanList,new   TypeToken<List<Person>>(){}.getType());           System.out.println("反序列之后");           for(Person pp:lists){                              System.out.println(pp);           }      }              public static void main(String[] args) {                testListBeanFromJSON();//测试集合反序列化           testOneBeanFromJSON();//测试单个实体类反序列化           //testToJSON();//测试序列化             }  }  

运行结果:

testListBeanFromJSON()  方法:  反序列之后  编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0  编号:1  名字:散仙1   地址:北京市1   E-mail:54152541@qq.com  钱:500.0  testOneBeanFromJSON()  方法:  编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0

实体类Person: 

package com.entity;    /**  * 实体类  *   *   * **/  public class Person {            private int id;      private String name;      private String address;      private String email;      private double money;            @Override      public String toString() {          // TODO Auto-generated method stub          return  "编号:"+id+"  名字:"+name+"   地址:"+address+"   E-mail:"+email+"  钱:"+money;      }      public Person() {          // TODO Auto-generated constructor stub      }      public Person(int id, String name, String address, String email,              double money) {          super();          this.id = id;          this.name = name;          this.address = address;          this.email = email;          this.money = money;      }      public int getId() {          return id;      }      public void setId(int id) {          this.id = id;      }      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }      public String getAddress() {          return address;      }      public void setAddress(String address) {          this.address = address;      }      public String getEmail() {          return email;      }      public void setEmail(String email) {          this.email = email;      }      public double getMoney() {          return money;      }      public void setMoney(double money) {          this.money = money;      }  }  

体会到了GSON的强大了吧,GSON还可以使用注解简化,在这里笔者就不给出代码了,有兴趣的读者可以自己研究一下


包含jar,javadoc,source的压缩包,google-gson-2.2.2-release.zip下载:http://download.csdn.net/detail/u010122002/7729949


0 0