Android Json解析簡單高效之org.json,取值如囊中取物
我們通常在Android上採用Gson來解析Json資料,很方便的就可以把資料轉換成List或者map。當碰到日期時間的時候,你可能會遇到坑,需要格式化一下日期時間格式。
本文介紹org.json這種不需要匯入任何包的解析方式,不管Json多少層,如探囊取物。
1、解析{“”:”“} 格式的 JSONObject
如何確認是這種格式,我們都不需要看,開啟 http://json.cn (Json線上解析及格式化驗證網站),把Json資料直接貼上到左邊,如果是正確的Json資料,在右邊我們就可以看到,如下圖:
Json資料
{“userId”:981,”GroupID”:2,”userNickName”:”xxx”,”userRealName”:”風清揚1223”}
在右邊已經顯示瞭解析後的結果,我們這時候點選 摺疊按鈕,如下圖:
點選之後的圖:
可以看到,摺疊之後,顯示了Object{…},這就表示起碼這一層是 JsonObject格式的資料,這就好辦了,我們開始寫程式碼。
private static final String jsonObjectString = "{\"userId\":981,\"groupId\":2,\"userNickName\":\"xxx\",\"userRealName\":\"風清揚1223\"}";
try {
// 新建JSONObject
JSONObject jsonObject = new JSONObject(jsonObjectString);
// 直接可得資料
String userId = jsonObject.getString("userId");
// 列印userId
Log.d(TAG, userId);
} catch (JSONException e) {
e.printStackTrace();
}
很簡單,新建JSONObject,就可以直接在裡面取資料。那下面還有一層呢,譬如下面這種格式的:
{“userId”:981,”GroupID”:2,”userNickName”:”xxx”,”userRealName”:”風清揚1223”,”xx”:{“yy”:”“}}
如果我們要取得yy的值,怎麼辦?不急,我們還是直接貼上到 json.cn網站:
再次點選xx旁邊的摺疊按鈕,如下圖:
可以看到,還是一個Object,這就好辦了,我們再來寫程式碼:
// 新建JSONObject
JSONObject jsonObject = new JSONObject(jsonObjectString);
// 先取得 xx的值,是個JSONObject
JSONObject yyObject = jsonObject.getJSONObject("xx");
// 再 取得yy的值
String yy = yyObject.getString("yy");
很方便吧,不管下面多少層,我們都可以通過這種方式方便的進行解析取值。
2、解析[{“”:”“},{“”:”“}] 格式的JsonArray
我們拿個這種格式的資料來舉例,如下:
[{“userId”:981,”GroupID”:2,”userNickName”:”xxx”,”userRealName”:”風清揚1223”},{“userId”:123,”GroupID”:1,”userNickName”:”yyy”,”userRealName”:”abc”}]
還是直接貼上到 json.cn,如下圖:
這次看起來比較複雜,別急,我們直接點選最外層的那個 摺疊按鈕:
點選之後:
可以看到,最外層是Array,我們開始寫程式碼,先得到這個Array,
private static final String jsonArrayString = "[{\"userId\":981,\"GroupID\":2,\"userNickName\":\"xxx\",\"userRealName\":\"風清揚1223\"},{\"userId\":123,\"GroupID\":1,\"userNickName\":\"yyy\",\"userRealName\":\"abc\"}]";
// 新建JSONArray
JSONArray jsonArray = new JSONArray(jsonArrayString);
好,到這裡,我們已經得到了最外層的那個JSONArray陣列,我們在 json.cn網站最外層摺疊,點選裡面的摺疊按鈕,如下:
之後我們看到:
是兩個Object,還能想到JSONObject麼,我們繼續完善程式碼:
// 新建JSONArray
JSONArray jsonArray = new JSONArray(jsonArrayString);
// 得到陣列下標為0的JSONObject
JSONObject jsonObject0 = jsonArray.getJSONObject(0);
重點是直接通過JSONArray 的 getJSONObject(index) 方法來得到JSONObject。
下面就好辦了,全部程式碼如下:
// 新建JSONArray
JSONArray jsonArray = new JSONArray(jsonArrayString);
// 得到陣列下標為0的JSONObject
JSONObject jsonObject0 = jsonArray.getJSONObject(0);
// 直接可取userId
String userId = jsonObject0.getString("userId");
3、總結
對於剛接觸Json的同學,可能會拿不準格式,我們通過直接貼上到json.cn 直接檢視解析後的格式。
無外乎兩種: Object 和 Array,對應到org.json,就是JSONObject 和 JSONArray。最外層都是直接new出來,裡面可直接org.json相應的方法去得到。
用這種方式,不管有多少層,就是多寫點JSONObject 和 JSONArray而已,都可以輕鬆取得你想要的值。
最後,附上Demo下載地址: 點選下載