gson使用异常

JackSON使用:

转自:http://hi.baidu.com/woodcock1017/item/53c3761099ac74071894ec99

Jackson使用备忘

Jackson主要使用ObjectMapper对象来进行序列化以及反序列化操作。

使用Jackson可以毫无压力的将复杂对象进行完全序列化,也可以将各种类型的对象反序列化

 

以下代码均省略异常处理

普通对象

序列化Order order对象:

ObjectMapper mapper = new ObjectMapper();

Writer strWriter = new StringWriter();

mapper.writeValue(strWriter, order);

String json = strWriter.toString();

 

反序列化:

Order order = mapper.readValue(json, Order.class);

 

链表、Map等

序列化List<Order> orderList:

ObjectMapper mapper = new ObjectMapper();

Writer strWriter = new StringWriter();

mapper.writeValue(strWriter, orderList);

String json = strWriter.toString();

 

 反序列化:

需要用到TypeReference

List<Order> orderList = mapper.readValue(json, new TypeReference<List<Order>>() {});  

如果反序列化为List<LinkedHashMap<String,String>>,则直接

List orderList = mapper.readValue(json, List.class);  

 

解析某个字段

JsonNode node = mapper.readTree(json);

String name= node.get("name");

GSON的使用:

转自:http://www.iteye.com/topic/1131510

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, "[email protected]"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\":\"[email protected]\",\"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\":\"[email protected]\",\"money\":500.0},{\"id\":1,\"name\":\"散仙1\",\"address\":\"北京市1\",\"email\":\"[email protected]\",\"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使用异常)