首页 > 代码库 > 【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】

【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】

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/list
GSON帮助文档http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html






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

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



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

Java代码  收藏代码
  1. package com.demoone;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.entity.Person;  
  7. import com.google.gson.Gson;  
  8. import com.google.gson.reflect.*;  
  9.   
  10. /*** 
  11.  *  
  12.  * 使用gson 
  13.  * 进行序列化,反序列化的操作 
  14.  * json 
  15.  *  
  16.  * **/  
  17. public class UseGson {  
  18.       
  19.  static Gson g=new Gson();  
  20.  /** 
  21.   *  
  22.   * 由集合类型的实体类 
  23.   * 转换成Json类型 
  24.   *  
  25.   * **/  
  26.     public static void testToJSON(){  
  27.           
  28.           
  29.         List<Person> list=new ArrayList<>();  
  30.           
  31.         for(int i=0;i<2;i++){  
  32.          Person p=new Person(i, "散仙"+i, "北京市"+i, "54152541@qq.com", 500.0);  
  33.             list.add(p);  
  34.         }  
  35.         String json=g.toJson(list);  
  36.         System.out.println(json);  
  37.           
  38.     }  
  39.       
  40.       
  41.     /** 
  42.      * 由json转换为实体类 
  43.      *  
  44.      * */  
  45.     public static void testOneBeanFromJSON(){  
  46.           
  47.        
  48.         /** 
  49.          * 转换一个Java Bean的时候 
  50.          * 记住不能使用[],只有在使用集合的时候才可以使用  
  51.          * 如上图贴的那个异常就是由此原因造成的,另外 
  52.          * 格式要规范,中间不能出现空格字符 
  53.          *  
  54.          * **/  
  55.         String jsonBean="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"54152541@qq.com\",\"money\":500.0}]";  
  56.          Person p=g.fromJson(jsonBean, Person.class);  
  57.          System.out.println(p);  
  58.    
  59.     }  
  60.       
  61.     /** 
  62.      * 由json转换为实体类集合 
  63.      *  
  64.      * */  
  65.     public static void testListBeanFromJSON(){  
  66.           
  67.        
  68.    
  69.           
  70.          /** 
  71.           * 转换一个集合 的实体Bean 
  72.           * 注意前面加上[]方括号,代表一个数组 
  73.           * **/  
  74.      
  75.            
  76.             
  77.            
  78.          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}]";  
  79.            
  80.          List<Person> lists=g.fromJson(jsonBeanList,new   TypeToken<List<Person>>(){}.getType());  
  81.          System.out.println("反序列之后");  
  82.          for(Person pp:lists){  
  83.                
  84.              System.out.println(pp);  
  85.          }  
  86.     }  
  87.       
  88.       
  89.     public static void main(String[] args) {  
  90.           
  91.          testListBeanFromJSON();//测试集合反序列化  
  92.          testOneBeanFromJSON();//测试单个实体类反序列化  
  93.          //testToJSON();//测试序列化  
  94.            
  95.     }  
  96.   
  97. }  


运行结果: 

Java代码  收藏代码
  1. testListBeanFromJSON()  方法:  
  2. 反序列之后  
  3. 编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0  
  4. 编号:1  名字:散仙1   地址:北京市1   E-mail:54152541@qq.com  钱:500.0  
  5. testOneBeanFromJSON()  方法:  
  6. 编号:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  钱:500.0  




实体类Person: 

Java代码  收藏代码
  1. package com.entity;  
  2.   
  3. /** 
  4.  * 实体类 
  5.  *  
  6.  *  
  7.  * **/  
  8. public class Person {  
  9.       
  10.     private int id;  
  11.     private String name;  
  12.     private String address;  
  13.     private String email;  
  14.     private double money;  
  15.       
  16.     @Override  
  17.     public String toString() {  
  18.         // TODO Auto-generated method stub  
  19.         return  "编号:"+id+"  名字:"+name+"   地址:"+address+"   E-mail:"+email+"  钱:"+money;  
  20.     }  
  21.     public Person() {  
  22.         // TODO Auto-generated constructor stub  
  23.     }  
  24.     public Person(int id, String name, String address, String email,  
  25.             double money) {  
  26.         super();  
  27.         this.id = id;  
  28.         this.name = name;  
  29.         this.address = address;  
  30.         this.email = email;  
  31.         this.money = money;  
  32.     }  
  33.     public int getId() {  
  34.         return id;  
  35.     }  
  36.     public void setId(int id) {  
  37.         this.id = id;  
  38.     }  
  39.     public String getName() {  
  40.         return name;  
  41.     }  
  42.     public void setName(String name) {  
  43.         this.name = name;  
  44.     }  
  45.     public String getAddress() {  
  46.         return address;  
  47.     }  
  48.     public void setAddress(String address) {  
  49.         this.address = address;  
  50.     }  
  51.     public String getEmail() {  
  52.         return email;  
  53.     }  
  54.     public void setEmail(String email) {  
  55.         this.email = email;  
  56.     }  
  57.     public double getMoney() {  
  58.         return money;  
  59.     }  
  60.     public void setMoney(double money) {  
  61.         this.money = money;  
  62.     }  
  63.       
  64.   
  65. }  



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

【jar包】JSON之解析利器GSON--【gson-2.2.4.jar】