1. 程式人生 > >Android開發之原生解析複雜的json資料

Android開發之原生解析複雜的json資料

前言:現在app開發肯定離開不了資料的解析,現在資料大部分都是json解析,多數人都使用第三方jar包來解析,但是原生解析同樣重要,今天我來實現一下如何用安卓原生來解析複雜的json資料,保準你看了此篇部落格之後永遠也不會擔心json資料的解析了!

-----------------分割線--------------------

先來看下json資料的構成:


這是一段天氣預報的json資料,資料大致分成四層,裡面有陣列有物件,數組裡面鑲嵌物件,物件裡面又有物件。

-----------------分割線------------------

結構分析:(程式碼可以作為javaBean,可自行實現)

    //第一層
    public int error_code;
    public String reason;
    public String resultcode;
    public JSONObject result;//含第二層:物件

    //result對應的第二層
    public JSONArray future;//含第三層:陣列
    public JSONObject sk;//含第三層:物件
    public JSONObject today;//含第三層:物件

    //future對應的第三層
    public String week;
    public JSONObject weather_id;//含第四層:物件

    //sk對應的第三層
    public String humidity;
    public String temp;
    public String time;
    public String wind_direction;
    public String wind_strength;

    //today對應的第三層
    public String city;
    public JSONObject weather_id;//含第四層:物件

    //weather_id對應的第四層
    public String fa;
    public String fb;
-----------第一層資料解析-----------
其實你把json資料給分析好,基本就是事半功倍了,通過json資料的構造圖我們可以知道result是一個大的物件,至於裡面什麼物件,要看第二層解析了!

ok,我們開始解析最外層資料:

public void click1(View view) {
        try {
            JSONObject jsonObject = new JSONObject(data);
            int error_code = jsonObject.getInt("error_code");
            String reason = jsonObject.getString("reason");
            String resultcode = jsonObject.getString("resultcode");
            JSONObject result = jsonObject.getJSONObject("result");
            Log.i("--最外層解析---->", "error_code:" + error_code);
            Log.i("--最外層解析---->", "reason:" + reason);
            Log.i("--最外層解析---->", "resultcode:" + resultcode);
            Log.i("--最外層解析---->", "result:" + result);
            parse2(result);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
截圖:
--------第二層資料解析--------
通過第一層的解析我們可以得到result這個大物件,可以通過json結構圖來看下第二層資料有誰。

ok來看第二層程式碼的解析:

private void parse2(JSONObject result) {
        try {
            JSONArray future = result.getJSONArray("future");
            JSONObject sk = result.getJSONObject("sk");
            JSONObject today = result.getJSONObject("today");
            Log.i("--result對應的第二層解析---->", "future:" + future);
            Log.i("--result對應的第二層解析---->", "sk:" + sk);
            Log.i("--result對應的第二層解析---->", "today:" + today);

            parse3_1(future);
            parse3_2(sk);
            parse3_3(today);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
看下執行結果:

---------第三層資料解析-----------
通過第二層解析可以知道,解析出來了兩個物件和一個數組,所以需要在第三層解析這三個資料:

sk和today的解析可以參考第二層解析,我們主要來看future的陣列解析。

分析:既然書陣列解析,我們肯定首先要知道陣列的個數,然後for迴圈解析,可以獲得陣列的每一個物件,然後再對每一個物件進行解析。

ok我們來看程式碼(解析的是區域性資料):

 private void parse3_1(JSONArray future) {
        try {
            for (int i = 0; i < future.length(); i++) {
                JSONObject jsonObject = future.getJSONObject(i);
                String week = jsonObject.getString("week");
                Log.i("--future對應的第三層解析--->", "week:" + week);
                JSONObject weather_id = jsonObject.getJSONObject("weather_id");
                Log.i("--future對應的第三層解析--->", "weather_id:" + weather_id);
                parse4(weather_id);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

來看執行效果圖:



-----------第四層資料解析--------
通過第三層解析,我們發現又有一個物件weather_id,這個解析起來比較簡單,我們快速看下程式碼:
    private void parse4(JSONObject weather_id) {
        try {
            String fa = weather_id.getString("fa");
            String fb = weather_id.getString("fb");
            Log.i("--weather_id對應的第四層解析-->", "fa:" + fa);
            Log.i("--weather_id對應的第四層解析-->", "fb:" + fb);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }
執行就不截圖了

------------------總結-------------------

其實json資料解析起來也非常簡單,這裡我簡單總結一下:

1.使用json格式化工具方便檢視json結構。

2.自己動手列出來陣列和物件。

關於陣列和物件的區分:

1.遇到{}就是一個物件,用JSONObject。

2.遇到[]就是陣列,用JSONArray。

-----------------下載-------------------