一、Json數據樣式
為了便於理解我們先來看看Json的數據樣式:
1. 單個數據對象
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
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數據
我 們可以明顯的發現,最后的建立日期是一個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. 單個數據對象
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
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數據
我 們可以明顯的發現,最后的建立日期是一個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