【史上最簡單】頭條項目中使用到的json解析

在項目使用到json解析網址返回的json格式數據,我的網絡訪問使用的是retrofit2.0框架,它裏面自帶了json轉換成object轉換器,當然,可以自己自定義轉換器。
其實,轉換器也是基於最基礎json的string文本來不斷的解析轉換,封裝而成的,所以我們最好搞懂最基礎的轉換方法。
我的數據是聚合數據:
https://www.juhe.cn/box/index/id/235
比如:

{
    "reason":"成功的返回",
    "result":{
        "stat":"1",
        "data":[
            {
                "uniquekey":"9acb533ba0f54242743fa9128a4d6ab3",
                "title":"不懼怕任何國家!中國進行國土防禦作戰完全沒有壓力!",
                "date":"2017-05-26 16:30",
                "category":"軍事",
                "author_name":"軍刀",
                "url":"http:\/\/mini.eastday.com\/mobile\/170526163040904.html",
                "thumbnail_pic_s":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_2_mwpm_03200403.jpeg",
                "thumbnail_pic_s02":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_3_mwpm_03200403.jpeg",
                "thumbnail_pic_s03":"http:\/\/08.imgmini.eastday.com\/mobile\/20170526\/20170526163040_8c883638d210ad10b70cd17679f2f3b3_4_mwpm_03200403.jpeg"
            },
            {
                "uniquekey":"9dfb9216a9767ed36665f778eb2cdfb2",
                "title":"同方威視華沙公司喜獲波蘭最具活力中小型企業獎",
                "date":"2017-05-26 16:20",
                "category":"軍事",
                "author_name":"中國網",
                "url":"http:\/\/mini.eastday.com\/mobile\/170526162000174.html",
                "thumbnail_pic_s":"http:\/\/06.imgmini.eastday.com\/mobile\/20170526\/20170526162000_d100909589f10e7972b6715a43a0a66a_1_mwpm_03200403.jpeg"
            },
            {
                "uniquekey":"30a6ccf5ec03c3166b737b25f369457a",
                "title":"普京手下兩大“海軍”浩浩蕩蕩奔赴戰場 海軍攜帶的這隻貓很不簡單",
                "date":"2017-05-26 16:16",
                "category":"軍事",
                "author_name":"軍情圖解",
                "url":"http:\/\/mini.eastday.com\/mobile\/170526161634427.html",
                "thumbnail_pic_s":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_3_mwpm_03200403.jpeg",
                "thumbnail_pic_s02":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_4_mwpm_03200403.jpeg",
                "thumbnail_pic_s03":"http:\/\/07.imgmini.eastday.com\/mobile\/20170526\/20170526161634_233fd32f75522e6f80b6eee7cbba6ad0_2_mwpm_03200403.jpeg"
            }
        ]
    },
    "error_code":0
}

通常返回的json格式和這個類型,複雜一點的無非各種嵌套出來的。。。
我們要做的就是一層一層解析再轉換。

我的代碼訪問使用了retrofit:

{
        Log.d("lihui", "List<Data> list---" + list);
        //1

        Retrofit retrofit = new Retrofit.Builder().
                baseUrl("http://v.juhe.cn/").
                addConverterFactory(GsonConverterFactory.create()).build();

        //2
        HttpService myService = retrofit.create(HttpService.class);
        //3
        retrofit.Call<ResponseBody> call = myService.getData(type, "9f3097f4cbe47e8abb01ca3b92e49cda");
        //4
        call.enqueue(new Callback<ResponseBody>() {

            @Override
            public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
                Log.d("lihui", "123onResponse");
                try {
                    ResponseBody httpResult = response.body();
                    //原始數據下手
                    String result = httpResult.string();
                    org.json.JSONObject jsonObject = new org.json.JSONObject(result);
                    String reason = jsonObject.getString("reason");
                    ToastUtils.setToastText(context, reason);
                    String result2 = jsonObject.getString("result");
                    org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2);
                    String stat = jsonObject2.getString("stat");
                    String data = jsonObject2.getString("data");
                    org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);
                    list.clear();
                    for (int i = 0; i < jsonArray2.length(); i++) {
                        //獲取每一個JsonObject對象
                        org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
                        if (myjObject != null) {
                            Data data1 = new Data(myjObject);
                            Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey());
                            Log.d("lihui", "Fragment onResponse data---" + data1);
                            list.add(data1);
                        }
                    }
                    if (list != null && list.size() > 0 && mHandler != null) {
                        Message msg = mHandler.obtainMessage();
                        msg.what = 0;
                        msg.obj = list;
                        mHandler.sendMessage(msg);
                        empty.setVisibility(View.GONE);
                        cacheMap.put(type, list);
                    }
                    Log.d("lihui", "159 list---" + list);

                } catch (Exception e) {
                    Log.d("lihui", "114e---" + e.getMessage());
                    pullToRefreshRecyclerView.onRefreshComplete();
                }
            }

            @Override
            public void onFailure(Throwable t) {
                Log.d("lihui", "165t:" + t.getMessage());
                t.printStackTrace();
                Message msg = mHandler.obtainMessage();
                msg.what = 1;
                msg.obj = type;
                mHandler.sendMessage(msg);
            }

        });
        return list;
    }

1、拿到最原始數據,服務器直接返回的 { xxxxx }
轉換成一個jsonObject

 org.json.JSONObject:這個是api自帶的
                    org.json.JSONObject jsonObject = new org.json.JSONObject(result);

2、拿到第二層對象result2 ,轉換成jsonObject。

       String reason = jsonObject.getString("reason");
                    ToastUtils.setToastText(context, reason);
                    String result2 = jsonObject.getString("result");
                                        org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2);

3、繼續拿第三層data,也是一個子對象。
這個對象可以看成是一個數組對象,jsonArray2 裏面有多個元素!!!

   String stat = jsonObject2.getString("stat");
                    String data = jsonObject2.getString("data");
                    org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);

4、第四層,數組裏面每個元素也是一個jsonobject對象。拿出來
org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);

  for (int i = 0; i < jsonArray2.length(); i++) {
                        //獲取每一個JsonObject對象
                        org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
                        if (myjObject != null) {
                            Data data1 = new Data(myjObject);
                            Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey());
                            Log.d("lihui", "Fragment onResponse data---" + data1);
                            list.add(data1);
                        }
                    }

好了,學會這個json格式的解析,應該沒有什麼可以難倒我們了吧,一層一層解析,這裏最主要的方法如下:

org.json.JSONObject :這個類,sdk自帶
jsonObject.getString("reason");
org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);
循環:
 for (int i = 0; i < jsonArray2.length(); i++) {
                        //獲取每一個JsonObject對象
                        org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
                        if (myjObject != null) {
                            Data data1 = new Data(myjObject);
                            Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey());
                            Log.d("lihui", "Fragment onResponse data---" + data1);
                            list.add(data1);
                        }
                    }



最後咱們拿到這個jsonobject對象,就可以自己自定義object了,構造初始化:

  public Data(JSONObject jsonObject) throws  Exception{
        this.title=jsonObject.getString("title");
        this.date=jsonObject.getString("date");
        this.author_name=jsonObject.getString("author_name");
        this.thumbnail_pic_s=jsonObject.getString("thumbnail_pic_s");
        //this.thumbnail_pic_s02=jsonObject.getString("thumbnail_pic_s02");
        //this.thumbnail_pic_s03=jsonObject.getString("thumbnail_pic_s03");
        this.url=jsonObject.getString("url");
   //     this.uniquekey=jsonObject.getString("uniquekey");

    }

結束~~~~~~~~~~~·

發佈了49 篇原創文章 · 獲贊 49 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章