您的位置:首页 > Web前端 > JavaScript

Gson-解析json之利器

2014-08-08 11:53 239 查看
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代码  


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  

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

Java代码  


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();//测试序列化  

           

    }  

  

}  

运行结果: 

Java代码  


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: 

Java代码  


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息