超好用的json解析工具——Gson项目使用详解

来源:互联网 发布:windows没有声音图标 编辑:程序博客网 时间:2024/05/09 03:04

http://blog.csdn.net/zhaokaiqiang1992/article/details/41517395


超好用的json解析工具——Gson项目使用详解

标签: gsonjsongoogle
 4114人阅读 评论(0) 收藏 举报
 分类:
 

目录(?)[+]

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

    在上一篇文章中,我们简单的介绍了json数据格式,并介绍了如何使用Android自带的json工具,完成json数据的生成与解析。但是就像我所说的,自带的工具类太难用了!因此这篇文章,会介绍一个json解析的非常好的工具,那就是google的开源项目Gson。

    咱们这次不介绍Gson里面的常用类了,因为常用的几个类非常的简单,我们直接上手开始用,看看Gson是多么的强大!

    当然,如果使用第三方的项目,我们肯定要导入jar包了,百度一搜一大把哈。

    先给出测试的Model代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">package com.example.jsondemo;  
  2.   
  3. public class Person {  
  4.   
  5.     private String name;  
  6.     private int age;  
  7.     private Birthday birthday;  
  8.   
  9.     public String getName() {  
  10.         return name;  
  11.     }  
  12.   
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.   
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.   
  25.     public Birthday getBirthday() {  
  26.         return birthday;  
  27.     }  
  28.   
  29.     public void setBirthday(Birthday birthday) {  
  30.         this.birthday = birthday;  
  31.     }  
  32.   
  33.     public Person() {  
  34.         super();  
  35.     }  
  36.   
  37.     public Person(String name, int age, Birthday birthday) {  
  38.         super();  
  39.         this.name = name;  
  40.         this.age = age;  
  41.         this.birthday = birthday;  
  42.     }  
  43.   
  44.     @Override  
  45.     public String toString() {  
  46.         return "Person [name=" + name + ", age=" + age + ", birthday="  
  47.                 + birthday + "]";  
  48.     }  
  49.   
  50. }</span>  

    为了让构造的对象更加复杂,所以定义了这个类,这样person类的属性就不只有基本数据类型了,让我们的测试更有代表性。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.jsondemo;  
  2.   
  3. /** 
  4.  *  
  5.  * @ClassName: com.example.jsondemo.Birthday 
  6.  * @Description: 生日类 
  7.  * @author zhaokaiqiang 
  8.  * @date 2014-11-26 上午10:29:47 
  9.  *  
  10.  */  
  11. public class Birthday {  
  12.   
  13.     private int year;  
  14.     private int month;  
  15.     private int day;  
  16.   
  17.     public int getYear() {  
  18.         return year;  
  19.     }  
  20.   
  21.     public void setYear(int year) {  
  22.         this.year = year;  
  23.     }  
  24.   
  25.     public int getMonth() {  
  26.         return month;  
  27.     }  
  28.   
  29.     public void setMonth(int month) {  
  30.         this.month = month;  
  31.     }  
  32.   
  33.     public int getDay() {  
  34.         return day;  
  35.     }  
  36.   
  37.     public void setDay(int day) {  
  38.         this.day = day;  
  39.     }  
  40.   
  41.     public Birthday() {  
  42.         super();  
  43.     }  
  44.   
  45.     public Birthday(int year, int month, int day) {  
  46.         super();  
  47.         this.year = year;  
  48.         this.month = month;  
  49.         this.day = day;  
  50.     }  
  51.   
  52.     @Override  
  53.     public String toString() {  
  54.         return "Birthday [year=" + year + ", month=" + month + ", day=" + day  
  55.                 + "]";  
  56.     }  
  57.   
  58. }  



    1.Object与Json的相互转换

    咱们先从最简单的单一对象开始说。

    下面是代码实现

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/** 
  2.      * 单一对象的json生成与解析 
  3.      */  
  4.     public void objectToJson() {  
  5.   
  6.         Person p = new Person("zhaokaiqiang"22new Birthday(1992119));  
  7.         Gson gson = new Gson();  
  8.   
  9.         String jsonString = gson.toJson(p);  
  10.   
  11.         Log.d(TAG, "---------单一对象生成--------");  
  12.         Log.d(TAG, jsonString);  
  13.   
  14.         Person person = gson.fromJson(jsonString, Person.class);  
  15.   
  16.         Log.d(TAG, "---------单一对象解析--------");  
  17.         Log.d(TAG, person.toString());  
  18.   
  19.     }</span>  

    这代码是多么的简洁,美观啊!

    在上一篇的文章中,如果要生成简单对象的话,我们还需要自己指定key,然后设置value,自从用了Gson,我们再也没有这些烦恼了!而且为了说明Gson的强大之处,我还特意给Person设置了一个对象Birthday,如果使用自带的json工具,那不就麻烦死了。但是使用Gson,根本不需要有这些顾虑。看下面的转换结果,一个toJson(),完全解决问题,太棒了!

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">11-26 16:16:38.392: D/GsonTest(16931): ---------单一对象生成--------  
  2. 11-26 16:16:38.392: D/GsonTest(16931): {"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}  
  3. 11-26 16:16:38.392: D/GsonTest(16931): ---------单一对象解析--------  
  4. 11-26 16:16:38.392: D/GsonTest(16931): Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]</span>  

    2.集合泛型与Json的相互转换

    Gson除了可以很方便的与单一对象进行转换之外,还能够与集合进行转换。

    下面是一个生成Json,并完成解析的代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * 集合对象的json生成与解析 
  3.      */  
  4.     public void objectsToJson() {  
  5.   
  6.         Gson gson = new Gson();  
  7.         Person person = new Person("zhaokaiqiang"22,  
  8.                 new Birthday(1992119));  
  9.         ArrayList<Person> arrayList = new ArrayList<Person>();  
  10.         arrayList.add(person);  
  11.         arrayList.add(person);  
  12.         arrayList.add(person);  
  13.   
  14.         String jsonString = gson.toJson(arrayList);  
  15.   
  16.         Log.d(TAG, "---------集合对象生成--------");  
  17.         Log.d(TAG, jsonString);  
  18.   
  19.         Type type = new TypeToken<ArrayList<Person>>() {  
  20.         }.getType();  
  21.   
  22.         ArrayList<Person> persons = gson.fromJson(jsonString, type);  
  23.   
  24.         Log.d(TAG, "---------集合对象解析--------");  
  25.         Log.d(TAG, persons.toString());  
  26.     }  

    这是转换出来的结果

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">---------集合对象生成--------  
  2. [{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22},{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}]  
  3.  ---------集合对象解析--------  
  4.  [Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]], Person [name=zhaokaiqiang, age=22, birthday=Birthday [year=1992, month=1, day=19]]]  
  5. </span>  

    如果我们想使用json完成类似的功能,复杂度是不可想象的,但是使用Gson来实现的话,却是如此简单。

    在使用Gson.toJson()方法的时候,我们可以把任何对象或者是集合放进去,就可以完美的转换成json格式。

    如果想把json格式的数据转换成我们想要的对象,我们只需要调用Gson.fromJson()即可。

    但是在转换的时候,第二个参数有两种形式,一种是Class<?>,这个是转换单一对象的时候,我们需要把对象.class传递进去,告诉转换器要转换的类型。如果我们需要转换的是集合类型,我们需要传递一个实现了Type接口的实例,具体语法就和上面的代码一样,只要把你用的集合类型还有具体的对象换一下就可以了。


------------------------------------------------------------分割线------------------------------------------------------------------

以上的内容是最简单的Gson的用法,我们基本上只使用到了Gson这一个类,对于基本需求来说没问题,

但是,如果想要创建和解析复杂的Json数据,就有点不够了。为了说明如何使用Gson解析更加复杂的数据,

特添加以下内容,即Gson的更高级用法

------------------------------------------------------------分割线--------------------------------------------------------------------


3.复杂json数据结构的构建与解析

    我们首先看看如何构建复杂的Json数据。

    上一篇文章中,我们已经知道Json数据有两种形式,Object形式(其实就是键值对形式),Array形式(即数组形式),我们以Object形式为例,介绍构建复杂Json。

    在开始构造之前,我们需要先介绍几个常用对象。

    Gson:这个类在前面已经用过了,是我们完成json转换和解析的主要类,主要使用toJson()和fromJson()这两个方法。

    JsonObject:这个是我们构建Object形式的Json数据的主要类,我们可以设置key和value。

    JsonElement:这个是Json元素类,它里面可以是一个JsonObject、JsonArray、JsonNull或者是一个JsonPrimitive。注意,它里面的数据只能看作是一个元素。

    JsonArray:这个是我们想构造Array形式的主要类,我们可以往数组里面添加数据,数据是有序的。

    JsonParser:这个是Json的解析器,主要作用是把一个Json形式的字符串转换成一个JsonElement对象。

    

    介绍完这些常用对象之后,我们下面看一下代码实现吧。

[java] view plain copy
  1. public String getJsonString() {  
  2.         Person p = new Person("zhaokaiqiang"22new Birthday(1992119));  
  3.         JsonElement jsonElement = new JsonParser().parse(new Gson().toJson(p));  
  4.           
  5.         JsonObject jsonObject = new JsonObject();  
  6.         jsonObject.addProperty("name""zhao");  
  7.         jsonObject.addProperty("age"22);  
  8.         jsonObject.add("person", jsonElement);  
  9.         Log.d(TAG, "getJsonString------" + jsonObject.toString());  
  10.         return jsonObject.toString();  
  11.     }  
    在上面的方法中,我们使用JsonParser和Gson只是为了获取一个JsonElement对象,因为使用JsonObject构造Object形式的Json数据的时候,基本数据类型可以使用addProperty()方法直接添加进去,但是如果想添加类的话,必须包装成一个JsonElement对象之后才能够添加,所以先用Gson的toJson()转换成一个Json格式的数据,然后使用JsonParser转换成一个JsonElement,使用add()添加进去之后,直接JsonObject.toString()就可以获取到复杂对象的Json格式数据了。

    下面是输出的结果,没有任何问题。

[java] view plain copy
  1. getJsonString------{"name":"zhao","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}}  


    知道了如何使用上面的这些类实现Json数据构建之后,下面我们讲解一下如何解析上面的这种复杂的json数据。

    我们先看代码吧

[java] view plain copy
  1. public void fromJsonString() {  
  2.   
  3.         Gson gson = new Gson();  
  4.         JsonElement jsonElement = new JsonParser().parse(getJsonString());  
  5.           
  6.         JsonObject jsonObject = jsonElement.getAsJsonObject();  
  7.   
  8.         JsonElement personElement = jsonObject.get("person");  
  9.         Person person = gson.fromJson(personElement, Person.class);  
  10.   
  11.         JsonElement nameElement = jsonObject.get("name");  
  12.         String name = nameElement.getAsString();  
  13.   
  14.         JsonElement ageElement = jsonObject.get("age");  
  15.         int age = ageElement.getAsInt();  
  16.   
  17.         Log.d(TAG, "person-----" + person);  
  18.         Log.d(TAG, "name-----" + name);  
  19.         Log.d(TAG, "age-----" + age);  
  20.   
  21.     }  

    如果我们要进行解析,我们必须获取到JsonElement对象,然后转换成JsonObject对象之后才能继续处理,所以在代码中进行了这样的处理。因为JsonElement是我们处理的基本元素,所以在获取到JsonObject之后,我们还需要根据key获取到对应value的JsonElement对象,然后根据不同的类型进行不同的转换即可。

    知道了这些之后,完成80%的业务需求应该没问题了。

    休息,休息一下...

0 0