超好用的json解析工具——Gson項目使用詳解

先給出測試的Model代碼
  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類的屬性就不只有基本數據類型了,讓我們的測試更有代表性。

  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的相互轉換

    咱們先從最簡單的單一對象開始說。

    下面是代碼實現

  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(),完全解決問題,太棒了!

  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,並完成解析的代碼:

  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.     }  

    這是轉換出來的結果
  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對象。

    

    介紹完這些常用對象之後,我們下面看一下代碼實現吧。

  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格式數據了。

    下面是輸出的結果,沒有任何問題。

  1. getJsonString------{"name":"zhao","age":22,"person":{"name":"zhaokaiqiang","birthday":{"day":19,"month":1,"year":1992},"age":22}}  


    知道了如何使用上面的這些類實現Json數據構建之後,下面我們講解一下如何解析上面的這種複雜的json數據。

    我們先看代碼吧

  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對象,然後根據不同的類型進行不同的轉換即可。
發佈了52 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章