通過Gson解析json數據


一、Json數據樣式

為了便於理解我們先來看看Json的數據樣式:

1. 單個數據對象

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

 

2. 多組數據

這是一組Json數據,可以看到就像數組一樣,一組數據是用[]圍起來的,內部{}圍起來的就是單個的數據對象

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

 

3. 嵌套數據

這段數據是用{}圍起來的所以是單個數據對象,我們又能發現其內部又是一個數據對象,名字叫foo2.這就是嵌套的Json數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "foo2": {
        "id": 200,
        "name": "haha"
    }
}
復制代碼

 

二、通過JsonReader解析Json數據

2.1 數據

String jsonData = "[{\"username\":\"name01\",\"userId\":001},{\"username\":\"name02\",\"userId\":002}]";

一般的Json都是從網上獲取的,這里為了簡單將Json數據直接用String定義。因為該數據中有各種標點符號,所以要用轉譯。

 

2.2 解析

復制代碼
    /**
     * @description 通過JsonReader解析Json對象
     * 
     * @web http://codego.net/480737/*/privatevoid jsonReaderTest() {
        // 這里的Json放到string中,所以加上了轉譯
        String jsonData = "[{\"username\":\"name01\",\"userId\":001},{\"username\":\"name02\",\"userId\":002}]";

        JsonReader reader = new JsonReader(new StringReader(jsonData));
        reader.setLenient(true); // 在寬松模式下解析try {
            reader.beginArray(); // 開始解析數組(包含一個或多個Json對象)while (reader.hasNext()) { // 如果有下一個數據就繼續解析
                reader.beginObject(); // 開始解析一個新的對象while (reader.hasNext()) {
                    String tagName = reader.nextName(); // 得到下一個屬性名if (tagName.equals("username")) {
                        System.out.println(reader.nextString());
                    } elseif (tagName.equals("userId")) {
                        System.out.println(reader.nextString());
                    }
                }
                reader.endObject(); // 結束對象的解析            }
            reader.endArray(); // 結束解析當前數組
        } catch (IOException e) {
            // TODO 自動生成的 catch 塊            e.printStackTrace();
        }
    }
復制代碼

在JsonReader的構造函數中傳入json data,然后開始解析,判斷是否還有下一個對象,如果有就開始解析對象名和對象體,直到解析完畢。

 

 三、通過Gson解析單個Json對象

 3.1 數據

assets/Json01

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

 

3.2 載入數據 

因為這個數據是定義在本地的,所以要先加載到內存中。方法是通過getAssets()得到AssetManager對象,再通過open(文件名)來獲得文件流。這里因為我能確保本地的文件小於1m,所以就沒做循環讀取,實際中請務必用循環讀取的方式。最終得到的數據存放在strData中。

復制代碼
  /**
     * @description 通過assets文件獲取json數據,這里寫的十分簡單,沒做循環判斷。
     *
     * @return Json數據(String)
     */private String getStrFromAssets(String name) {
        String strData = null;
        try {
            InputStream inputStream = getAssets().open(name);
            byte buf[] = newbyte[1024];
            inputStream.read(buf);
            strData = new String(buf);
            strData = strData.trim();

        } catch (IOException e) {
            // TODO 自動生成的 catch 塊            e.printStackTrace();
        }
        System.out.println("strData = " + strData);
        return strData;
    }
復制代碼

 

3.3 建立類

首先,我們要根據數據的格式定義一個類

復制代碼
publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

這個類的定義方式有講究:

1>類里面的成員變量名必須跟Json字段里面的name是一模一樣的:

"id": 100,  ----  public int id;

2>如果Json數據是嵌套定義的,那么這個類中就的成員變量肯定有個類對象,一般這個類包含內部類

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "childFoo": {
        "id": 200,
        "name": "jack"
    }
}
復制代碼
復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。
}
復制代碼

 

3.4 開始解析

復制代碼
/**
     * @description 將json數據解析為類對象
     */privatevoid GsonTest01() {
        Foo01 foo = new Gson().fromJson(getStrFromAssets("Json01"), Foo01.class);
        System.out.println("id = " + foo.id);
    }
復制代碼

 

 

四、通過Gson將數據轉換為Date對象,並且重命名

4.1 數據

本例的數據和上面完全一樣,是單個的Json數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

我 們可以明顯的發現,最后的建立日期是一個date對象,但通過一般的解析方式,我們只能把日期數據賦值給string,但以后的操作就很麻煩了。因此,我 們用到了gsonBuilder。gsonBuilder可以通過檢查json數據的格式,講符合用戶設置格式的數據變為相應的對象,下面就來演示一下。

 

4.2 解析

解析還是兩步,首先定義一個類:

復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。public String get_my_date() {return createdAt.toString();
    }
}
復制代碼

 然后,通過gson解析:

復制代碼
    /**
     * @description 當json中有日期對象時,通過定義構建格式生成需要的date對象
     * 當json數據命名和java命名產生不一致時,可以通過注釋的方式實現更換名字,更方便進行代碼處理
     */privatevoid GsonTest02() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 設置日期的格式,遇到這個格式的數據轉為Date對象
        Gson gson = gsonBuilder.create();
        Foo02 foo = gson.fromJson(getStrFromAssets("Json01"), Foo02.class);
        System.out.println("date = " + foo.get_my_date());
    }
復制代碼

 

分析:初始化GsonBuilder后,通過setDateFormat來設置什么樣的數據會變為date對象,因為原始數據中created_at的日期格式是yyyy-mm-dd HH:mm:ss所以就寫了如下的代碼:

gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 設置日期的格式,遇到這個格式的數據轉為Date對象

之后再通過gsonBuilder的create來建立gson對象,然后解析即可。

 

4.3 重命名

有 時候json的對象名不符合java命名規則,比如這個created_at就沒采用駝峰命名法,但java代碼中推薦用駝峰命名,這樣就產生了矛盾,雖 然可以用別的方式來解決,但我們還希望用代碼在不影響解析的情況下,產生符合java命名規則的成員變量。實現也相當簡單,用注釋。

復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。public String get_my_date() {
        // 可以通過simpleDateFormat指定data對象的輸出格式,注意:如果要添加自定義字符串,比如下面的custom,必須在字符串兩邊加單引號。
        SimpleDateFormat dateFormat = new SimpleDateFormat("'custom'_yyyyMMdd_HHmmss");
        //return dateFormat.format(created_at);return createdAt.toString();
    }
}
復制代碼

在建立 Date對象時,我們在上面加上了換名設定,這樣gson解析時會根據created_at來初始化這個date對象,而我們使用的時候用 craetedAt就可以了。這里順便提一下,如果你要輸出date,可以通過simpleDtaeFormat來設置輸出的格式,這點在設置照片名或文 件名時很有用。當然,如果你沒這個需求,你完全可以用toString()方法。

 

 

 

五、解析嵌套的Json數據

5.1數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "childFoo": {
        "id": 200,
        "name": "jack"
    }
}
復制代碼

先來分析下數據,這是一個單個數據,里面嵌套了一個childFoo。那么構建類的時候就需要有兩個類,一個類包含id,body,number,created_at,childFoo.另一個類中包含id,name。

 

5.2 構建類

這里為了簡單,把兩個類合二為一了。注意下這個內部類其實可以不叫ChildFoo的,只要這個類產生的對象的名字叫做childFoo就行(區分大小寫)。

復制代碼
package com.kale.gsontest;

/**
 * @author:Jack Tony
 * @description  : 針對有嵌套的json數據
 * @date  :2015年1月24日
 */publicclass Foo03 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
    public ChildFoo childFoo;

    publicclass ChildFoo {
        publicint id;
        public String name;
    }
}
復制代碼

 

5.3 解析

復制代碼
/**
     * @description 解析嵌套是Json數據
     *
     */privatevoid GsonTest03() {
        Foo03 foo = new Gson().fromJson(getStrFromAssets("Json02"), Foo03.class);
        System.out.println("name = " + foo.childFoo.name);
    }
復制代碼

為了看是否解析成功,這里直接輸出類中內部類的成員變量:name

 

 

六、將Json序列解析為數組

6.1 數據

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

通常情況下Json數據包含多個對象,如果不包含多個對象的情況比較少見。舉個例子:

http://m.weather.com.cn/data/101010100.html

復制代碼
{"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4日","date":"","week":"星期二","fchh":"11","cityid":"101010100","temp1":"8℃~-3℃","temp2":"8℃~-3℃","temp3":"7℃~-3℃","temp4":"8℃~-1℃","temp5":"10℃~1℃","temp6":"10℃~2℃","tempF1":"46.4℉~26.6℉","tempF2":"46.4℉~26.6℉","tempF3":"44.6℉~26.6℉","tempF4":"46.4℉~30.2℉","tempF5":"50℉~33.8℉","tempF6":"50℉~35.6℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴轉多雲","weather5":"多雲","weather6":"多雲","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"1","img9":"1","img10":"99","img11":"1","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"多雲","img_title9":"多雲","img_title10":"多雲","img_title11":"多雲","img_title12":"多雲","img_title_single":"晴","wind1":"北風4-5級轉微風","wind2":"微風","wind3":"微風","wind4":"微風","wind5":"微風","wind6":"微風","fx1":"北風","fx2":"微風","fl1":"4-5級轉小於3級","fl2":"小於3級","fl3":"小於3級","fl4":"小於3級","fl5":"小於3級","fl6":"小於3級","index":"寒冷","index_d":"天氣寒冷,建議着厚羽絨服、毛皮大衣加厚毛衣等隆冬服裝。年老體弱者尤其要注意保暖防凍。","index48":"冷","index48_d":"天氣冷,建議着棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜着厚棉衣、冬大衣或厚羽絨服。","index_uv":"中等","index48_uv":"中等","index_xc":"較適宜","index_tr":"一般","index_co":"較舒適","st1":"7","st2":"-3","st3":"8","st4":"0","st5":"7","st6":"-1","index_cl":"較不宜","index_ls":"基本適宜","index_ag":"易發"}}
復制代碼

現在我們想把這多個對象解析為一個數組對象,應該怎么做呢?

 

6.2 建立類

十分簡單,包含一個對象中的信息即可。順便一提,如果你不需要解析那么多結果,你可以僅僅列出你想要解析的變量。

復制代碼
publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

 

6.3 解析

復制代碼
/**
     * @description 解析為數組
     *
     */privatevoid GsonTest04() {
        Foo01[] foos = new Gson().fromJson(getStrFromAssets("Json03"), Foo01[].class);
        System.out.println("name01 = " + foos[0].id);
        System.out.println("name02 = " + foos[1].id);
        // 這時候想轉成List的話調用如下方法
        // List<Foo> foosList = Arrays.asList(foos);
    }
復制代碼

gson的構造函數提供了解析成數組對象的方法,所以直接像解析單個對象一樣使用就行。

 

 

七、將數據解析為list

7.1 數據

這個數據和上面完全一樣

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

 

7.2 建立類

類也和上面的一樣,沒任何變化

復制代碼
package com.kale.gsontest;

publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

 

7.3 解析

復制代碼
/**
     * @description 將json序列變為list對象
     *
     */privatevoid GsonTest05() {
        Type listType = new TypeToken<ArrayList<Foo01>>(){}.getType();
ArrayList<Foo01> foos = new Gson().fromJson(getStrFromAssets("Json03"), listType); for (int i = 0; i < foos.size(); i++) { System.out.println("name ["+ i +"] = " + foos.get(i).id); } }
復制代碼

這里不同的一點就是要定義list的類型,其余的沒什么可說的。一般我們都會用這種方式將數據放到list中,很少會用到解析成數組。

 

 

源碼下載:http://download.csdn.net/detail/shark0017/8393351

 

 

雲筆記鏈接:

一、Json數據樣式

為了便於理解我們先來看看Json的數據樣式:

1. 單個數據對象

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

 

2. 多組數據

這是一組Json數據,可以看到就像數組一樣,一組數據是用[]圍起來的,內部{}圍起來的就是單個的數據對象

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

 

3. 嵌套數據

這段數據是用{}圍起來的所以是單個數據對象,我們又能發現其內部又是一個數據對象,名字叫foo2.這就是嵌套的Json數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "foo2": {
        "id": 200,
        "name": "haha"
    }
}
復制代碼

 

二、通過JsonReader解析Json數據

2.1 數據

String jsonData = "[{\"username\":\"name01\",\"userId\":001},{\"username\":\"name02\",\"userId\":002}]";

一般的Json都是從網上獲取的,這里為了簡單將Json數據直接用String定義。因為該數據中有各種標點符號,所以要用轉譯。

 

2.2 解析

復制代碼
    /**
     * @description 通過JsonReader解析Json對象
     * 
     * @web http://codego.net/480737/*/privatevoid jsonReaderTest() {
        // 這里的Json放到string中,所以加上了轉譯
        String jsonData = "[{\"username\":\"name01\",\"userId\":001},{\"username\":\"name02\",\"userId\":002}]";

        JsonReader reader = new JsonReader(new StringReader(jsonData));
        reader.setLenient(true); // 在寬松模式下解析try {
            reader.beginArray(); // 開始解析數組(包含一個或多個Json對象)while (reader.hasNext()) { // 如果有下一個數據就繼續解析
                reader.beginObject(); // 開始解析一個新的對象while (reader.hasNext()) {
                    String tagName = reader.nextName(); // 得到下一個屬性名if (tagName.equals("username")) {
                        System.out.println(reader.nextString());
                    } elseif (tagName.equals("userId")) {
                        System.out.println(reader.nextString());
                    }
                }
                reader.endObject(); // 結束對象的解析            }
            reader.endArray(); // 結束解析當前數組
        } catch (IOException e) {
            // TODO 自動生成的 catch 塊            e.printStackTrace();
        }
    }
復制代碼

在JsonReader的構造函數中傳入json data,然后開始解析,判斷是否還有下一個對象,如果有就開始解析對象名和對象體,直到解析完畢。

 

 三、通過Gson解析單個Json對象

 3.1 數據

assets/Json01

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

 

3.2 載入數據 

因為這個數據是定義在本地的,所以要先加載到內存中。方法是通過getAssets()得到AssetManager對象,再通過open(文件名)來獲得文件流。這里因為我能確保本地的文件小於1m,所以就沒做循環讀取,實際中請務必用循環讀取的方式。最終得到的數據存放在strData中。

復制代碼
  /**
     * @description 通過assets文件獲取json數據,這里寫的十分簡單,沒做循環判斷。
     *
     * @return Json數據(String)
     */private String getStrFromAssets(String name) {
        String strData = null;
        try {
            InputStream inputStream = getAssets().open(name);
            byte buf[] = newbyte[1024];
            inputStream.read(buf);
            strData = new String(buf);
            strData = strData.trim();

        } catch (IOException e) {
            // TODO 自動生成的 catch 塊            e.printStackTrace();
        }
        System.out.println("strData = " + strData);
        return strData;
    }
復制代碼

 

3.3 建立類

首先,我們要根據數據的格式定義一個類

復制代碼
publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

這個類的定義方式有講究:

1>類里面的成員變量名必須跟Json字段里面的name是一模一樣的:

"id": 100,  ----  public int id;

2>如果Json數據是嵌套定義的,那么這個類中就的成員變量肯定有個類對象,一般這個類包含內部類

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "childFoo": {
        "id": 200,
        "name": "jack"
    }
}
復制代碼
復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。
}
復制代碼

 

3.4 開始解析

復制代碼
/**
     * @description 將json數據解析為類對象
     */privatevoid GsonTest01() {
        Foo01 foo = new Gson().fromJson(getStrFromAssets("Json01"), Foo01.class);
        System.out.println("id = " + foo.id);
    }
復制代碼

 

3.5 結果

 

四、通過Gson將數據轉換為Date對象,並且重命名

4.1 數據

本例的數據和上面完全一樣,是單個的Json數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38"
}
復制代碼

我 們可以明顯的發現,最后的建立日期是一個date對象,但通過一般的解析方式,我們只能把日期數據賦值給string,但以后的操作就很麻煩了。因此,我 們用到了gsonBuilder。gsonBuilder可以通過檢查json數據的格式,講符合用戶設置格式的數據變為相應的對象,下面就來演示一下。

 

4.2 解析

解析還是兩步,首先定義一個類:

復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。public String get_my_date() {return createdAt.toString();
    }
}
復制代碼

 然后,通過gson解析:

復制代碼
    /**
     * @description 當json中有日期對象時,通過定義構建格式生成需要的date對象
     * 當json數據命名和java命名產生不一致時,可以通過注釋的方式實現更換名字,更方便進行代碼處理
     */privatevoid GsonTest02() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 設置日期的格式,遇到這個格式的數據轉為Date對象
        Gson gson = gsonBuilder.create();
        Foo02 foo = gson.fromJson(getStrFromAssets("Json01"), Foo02.class);
        System.out.println("date = " + foo.get_my_date());
    }
復制代碼

 

分析:初始化GsonBuilder后,通過setDateFormat來設置什么樣的數據會變為date對象,因為原始數據中created_at的日期格式是yyyy-mm-dd HH:mm:ss所以就寫了如下的代碼:

gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 設置日期的格式,遇到這個格式的數據轉為Date對象

之后再通過gsonBuilder的create來建立gson對象,然后解析即可。

 

4.3 重命名

有 時候json的對象名不符合java命名規則,比如這個created_at就沒采用駝峰命名法,但java代碼中推薦用駝峰命名,這樣就產生了矛盾,雖 然可以用別的方式來解決,但我們還希望用代碼在不影響解析的情況下,產生符合java命名規則的成員變量。實現也相當簡單,用注釋。

復制代碼
publicclass Foo02 {
    privateint id;
    private String body;
    privatefloat number;
    
    @SerializedName("created_at")
    private Date createdAt; // 通過注釋的方式更換名字,同時保證使用方式不變。public String get_my_date() {
        // 可以通過simpleDateFormat指定data對象的輸出格式,注意:如果要添加自定義字符串,比如下面的custom,必須在字符串兩邊加單引號。
        SimpleDateFormat dateFormat = new SimpleDateFormat("'custom'_yyyyMMdd_HHmmss");
        //return dateFormat.format(created_at);return createdAt.toString();
    }
}
復制代碼

在建立 Date對象時,我們在上面加上了換名設定,這樣gson解析時會根據created_at來初始化這個date對象,而我們使用的時候用 craetedAt就可以了。這里順便提一下,如果你要輸出date,可以通過simpleDtaeFormat來設置輸出的格式,這點在設置照片名或文 件名時很有用。當然,如果你沒這個需求,你完全可以用toString()方法。

 

4.4 結果

可以看見,這里的date對象是按照標准的格式進行顯示的,說明解析成功!

 

五、解析嵌套的Json數據

5.1數據

復制代碼
{
    "id": 100,
    "body": "It is my post",
    "number": 0.13,
    "created_at": "2014-05-22 19:12:38",
    "childFoo": {
        "id": 200,
        "name": "jack"
    }
}
復制代碼

先來分析下數據,這是一個單個數據,里面嵌套了一個childFoo。那么構建類的時候就需要有兩個類,一個類包含id,body,number,created_at,childFoo.另一個類中包含id,name。

 

5.2 構建類

這里為了簡單,把兩個類合二為一了。注意下這個內部類其實可以不叫ChildFoo的,只要這個類產生的對象的名字叫做childFoo就行(區分大小寫)。

復制代碼
package com.kale.gsontest;

/**
 * @author:Jack Tony
 * @description  : 針對有嵌套的json數據
 * @date  :2015年1月24日
 */publicclass Foo03 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
    public ChildFoo childFoo;

    publicclass ChildFoo {
        publicint id;
        public String name;
    }
}
復制代碼

 

5.3 解析

復制代碼
/**
     * @description 解析嵌套是Json數據
     *
     */privatevoid GsonTest03() {
        Foo03 foo = new Gson().fromJson(getStrFromAssets("Json02"), Foo03.class);
        System.out.println("name = " + foo.childFoo.name);
    }
復制代碼

為了看是否解析成功,這里直接輸出類中內部類的成員變量:name

 

5.4 結果

可以看見,輸出了childFoo中的name值:jack

 

六、將Json序列解析為數組

6.1 數據

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

通常情況下Json數據包含多個對象,如果不包含多個對象的情況比較少見。舉個例子:

http://m.weather.com.cn/data/101010100.html

復制代碼
{"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4日","date":"","week":"星期二","fchh":"11","cityid":"101010100","temp1":"8℃~-3℃","temp2":"8℃~-3℃","temp3":"7℃~-3℃","temp4":"8℃~-1℃","temp5":"10℃~1℃","temp6":"10℃~2℃","tempF1":"46.4℉~26.6℉","tempF2":"46.4℉~26.6℉","tempF3":"44.6℉~26.6℉","tempF4":"46.4℉~30.2℉","tempF5":"50℉~33.8℉","tempF6":"50℉~35.6℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴轉多雲","weather5":"多雲","weather6":"多雲","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"1","img9":"1","img10":"99","img11":"1","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"多雲","img_title9":"多雲","img_title10":"多雲","img_title11":"多雲","img_title12":"多雲","img_title_single":"晴","wind1":"北風4-5級轉微風","wind2":"微風","wind3":"微風","wind4":"微風","wind5":"微風","wind6":"微風","fx1":"北風","fx2":"微風","fl1":"4-5級轉小於3級","fl2":"小於3級","fl3":"小於3級","fl4":"小於3級","fl5":"小於3級","fl6":"小於3級","index":"寒冷","index_d":"天氣寒冷,建議着厚羽絨服、毛皮大衣加厚毛衣等隆冬服裝。年老體弱者尤其要注意保暖防凍。","index48":"冷","index48_d":"天氣冷,建議着棉服、羽絨服、皮夾克加羊毛衫等冬季服裝。年老體弱者宜着厚棉衣、冬大衣或厚羽絨服。","index_uv":"中等","index48_uv":"中等","index_xc":"較適宜","index_tr":"一般","index_co":"較舒適","st1":"7","st2":"-3","st3":"8","st4":"0","st5":"7","st6":"-1","index_cl":"較不宜","index_ls":"基本適宜","index_ag":"易發"}}
復制代碼

現在我們想把這多個對象解析為一個數組對象,應該怎么做呢?

 

6.2 建立類

十分簡單,包含一個對象中的信息即可。順便一提,如果你不需要解析那么多結果,你可以僅僅列出你想要解析的變量。

復制代碼
publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

 

6.3 解析

復制代碼
/**
     * @description 解析為數組
     *
     */privatevoid GsonTest04() {
        Foo01[] foos = new Gson().fromJson(getStrFromAssets("Json03"), Foo01[].class);
        System.out.println("name01 = " + foos[0].id);
        System.out.println("name02 = " + foos[1].id);
        // 這時候想轉成List的話調用如下方法
        // List<Foo> foosList = Arrays.asList(foos);
    }
復制代碼

gson的構造函數提供了解析成數組對象的方法,所以直接像解析單個對象一樣使用就行。

 

6.4 結果

 

七、將數據解析為list

7.1 數據

這個數據和上面完全一樣

復制代碼
[{
    "id": 100,
    "body": "It is my post1",
    "number": 0.13,
    "created_at": "2014-05-20 19:12:38"
},
{
    "id": 101,
    "body": "It is my post2",
    "number": 0.14,
    "created_at": "2014-05-22 19:12:38"
}]
復制代碼

 

7.2 建立類

類也和上面的一樣,沒任何變化

復制代碼
package com.kale.gsontest;

publicclass Foo01 {
    publicint id;
    public String body;
    publicfloat number;
    public String created_at;
}
復制代碼

 

7.3 解析

復制代碼
/**
     * @description 將json序列變為list對象
     *
     */privatevoid GsonTest05() {
        Type listType = new TypeToken<ArrayList<Foo01>>(){}.getType();
ArrayList<Foo01> foos = new Gson().fromJson(getStrFromAssets("Json03"), listType); for (int i = 0; i < foos.size(); i++) { System.out.println("name ["+ i +"] = " + foos.get(i).id); } }
復制代碼

這里不同的一點就是要定義list的類型,其余的沒什么可說的。一般我們都會用這種方式將數據放到list中,很少會用到解析成數組。

 

7.4 結果

 

源碼以及所需包下載:http://download.csdn.net/detail/shark0017/8393351

源碼以及所需包下載(雲筆記):http://note.youdao.com/yws/public/redirect/share?id=4e54883c530ec00f13b4b51e817d98d7&type=false


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM