1. 程式人生 > >Android框架之路——Json解析一篇就夠(原生技術+Gson+FastJson)

Android框架之路——Json解析一篇就夠(原生技術+Gson+FastJson)

  • 原生技術手動解析

    • 將json物件轉換成JavaBean

      1. Api介紹(org.json包下)

        JSONObject(String string) : 建構函式,將json字串解析為json物件.
        int length() : 得到json物件的長度.
        Xxx getXxx(String name) : 根據name獲取json物件中對應的value,不存在時造成空指標異常.
        Xxx optXxx(String name) : 根據name獲取json物件中對應的value,不存在時返回""或預設值.
        
      2. 測試json資料

        {
            "status": "0",
            "msg": "ok",
            "result": "哈哈啊哈哈哈哈"
        }
        
      3. 實現解析

        private void jsonToJavaBeanByNative() {
            String json = "{\n" +
                    "    \"status\": \"0\",\n" +
                    "    \"msg\": \"ok\",\n" +
                    "    \"result\": \"哈哈啊哈哈哈哈\"\n" +
                    "}";
            //解析
            try {
                JSONObject jsonObject = new JSONObject(json);
                String status = jsonObject.getString("status");
                String result = jsonObject.optString("result");
                String msg = jsonObject.optString("msg");
        
                tv1.setText(json);
                tv2.setText(new DemoBean(status, msg, result).toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        
    • 將json陣列轉換成JavaBean的List集合

      1. Api介紹(org.json包下)

        JSONArray(String string) : 建構函式,將json字串解析為json陣列.
        int length() : 得到json陣列的長度.
        Xxx getXxx(String name) : 根據name獲取json陣列中對應的value,不存在時造成空指標異常.
        Xxx optXxx(String name) : 根據name獲取json陣列中對應的value,不存在時返回""或預設值.
        
      2. 測試json資料

        [
            {
                "status": "0",
                "msg": "ok",
                "result": "哈哈啊哈哈哈哈"
            },
            {
                "status": "1",
                "msg": "Error",
                "result": "空的"
            }
        ]
        
      3. 實現解析

        private void jsonToJavaBeanListByNative() {
            String json = "[\n" +
                    "    {\n" +
                    "        \"status\": \"0\",\n" +
                    "        \"msg\": \"ok\",\n" +
                    "        \"result\": \"哈哈啊哈哈哈哈\"\n" +
                    "    },\n" +
                    "    {\n" +
                    "        \"status\": \"1\",\n" +
                    "        \"msg\": \"Error\",\n" +
                    "        \"result\": \"空的\"\n" +
                    "    }\n" +
                    "]";
        
            List<DemoBean> list = new ArrayList<>();
            try {
                JSONArray jsonArray = new JSONArray(json);
        
                for (int i = 0; i < jsonArray.length(); i++){
                    JSONObject obj = jsonArray.getJSONObject(i);
        
                    if(obj != null){
                        String status = obj.getString("status");
                        String result = obj.optString("result");
                        String msg = obj.optString("msg");
        
                        list.add(new DemoBean(status, msg, result));
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        
            tv1.setText(json);
            tv2.setText(list.toString());
        }
        
    • 複雜json資料解析

      1. 測試json資料

        {
            "status": "0",
            "msg": "ok",
            "result": {
                "total": "33731",
                "pagenum": "1",
                "pagesize": "1",
                "list": [
                    {
                        "content": "文化交流請問如何氣溫哦日哦還欠我I偶然窮溫家窮檔案哦I你去我就餓哦老婆群檔案歐賠",
                        "addtime": "2014-10-14 15:48:18",
                        "url": "http://m.kaixinhui.com/detail-26458.html"
                    },
                    {
                        "content": "可是到了好看你看我哪捨得回來可完全認可啊你說的卡就好了啊深刻的理解好看啦可能去問價錢",
                        "addtime": "2014-10-14 15:48:18",
                        "url": "http://m.kaixinhui.com/detail-26458.html"
                    }
                ]
            }
        }
        
      2. 使用GsonFormat生成JavaBean
        • File—>Settings—>Plugins—>搜尋GsonFormat外掛—>安裝
      3. 實現解析

        private void parseComplexJson() {
            String json = "{\n" +
                    "    \"status\": \"0\",\n" +
                    "    \"msg\": \"ok\",\n" +
                    "    \"result\": {\n" +
                    "        \"total\": \"33731\",\n" +
                    "        \"pagenum\": \"1\",\n" +
                    "        \"pagesize\": \"1\",\n" +
                    "        \"list\": [\n" +
                    "            {\n" +
                    "                \"content\": \"文化交流請問如何氣溫哦日哦還欠我I偶然窮溫家窮檔案哦I你去我就餓哦老婆群檔案歐賠\",\n" +
                    "                \"addtime\": \"2014-10-14 15:48:18\",\n" +
                    "                \"url\": \"http://m.kaixinhui.com/detail-26458.html\"\n" +
                    "            },\n" +
                    "            {\n" +
                    "                \"content\": \"可是到了好看你看我哪捨得回來可完全認可啊你說的卡就好了啊深刻的理解好看啦可能去問價錢\",\n" +
                    "                \"addtime\": \"2014-10-14 15:48:18\",\n" +
                    "                \"url\": \"http://m.kaixinhui.com/detail-26458.html\"\n" +
                    "            }\n" +
                    "        ]\n" +
                    "    }\n" +
                    "}";
        
            ComplexDemoBean complexDemoBean = new ComplexDemoBean();
        
            try {
                JSONObject jsonObject = new JSONObject(json);
                complexDemoBean.setStatus(jsonObject.optString("status"));
                complexDemoBean.setMsg(jsonObject.optString("msg"));
                JSONObject object = jsonObject.optJSONObject("result");
        
                ComplexDemoBean.ResultBean resultBean = new ComplexDemoBean.ResultBean();
                resultBean.setTotal(object.optString("total"));
                resultBean.setPagenum(object.optString("pagenum"));
                resultBean.setPagesize(object.optString("pagesize"));
                JSONArray list = object.getJSONArray("list");
        
                List<ComplexDemoBean.ResultBean.ListBean> beanList = new ArrayList<>();
                for (int i = 0; i < list.length(); i++){
                    ComplexDemoBean.ResultBean.ListBean listBean = new ComplexDemoBean.ResultBean.ListBean();
                    JSONObject obj = list.getJSONObject(i);
                    listBean.setContent(obj.optString("content"));
                    listBean.setAddtime(obj.optString("addtime"));
                    listBean.setUrl(obj.optString("url"));
                    beanList.add(listBean);
                }
        
                resultBean.setList(beanList);
                complexDemoBean.setResult(resultBean);
        
                tv1.setText(json);
                tv2.setText(complexDemoBean.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        
    • 特殊json資料解析

      有些資料他們的key為數字,使用GsonFormat外掛生成JavaBean是有問題的,這時需要我們自己去手寫Bean。

      1. 示例Json

        {
            "code": 0,
            "list": {
                "0": {
                    "aid": "9698756",
                    "author": "嗶哩嗶哩番劇",
                    "copyright": "Copy",
                    "create": "2017-04-08 18:39",
                    "coins": 22043
                },
                "1": {
                    "aid": "9854952",
                    "author": "嗶哩嗶哩番劇",
                    "copyright": "Copy",
                    "create": "2017-04-15 15:29",
                    "coins": 16991
                }
            }
        }
        
      2. 自定義JavaBean

        public class FilmInfo {
        
            private int code;
            private List<FilmBean> list;
        
            @Override
            public String toString() {
                return "FilmInfo{" +
                        "code=" + code +
                        ", list=" + list +
                        '}';
            }
        
            public int getCode() {
                return code;
            }
        
            public void setCode(int code) {
                this.code = code;
            }
        
            public List<FilmBean> getList() {
                return list;
            }
        
            public void setList(List<FilmBean> list) {
                this.list = list;
            }
        
            public static class FilmBean{
                private String aid;
                private String author;
                private int coins;
                private String copyright;
                private String create;
        
                @Override
                public String toString() {
                    return "FilmBean{" +
                            "aid='" + aid + '\'' +
                            ", author='" + author + '\'' +
                            ", coins=" + coins +
                            ", copyright='" + copyright + '\'' +
                            ", create='" + create + '\'' +
                            '}';
                }
        
                public String getAid() {
                    return aid;
                }
        
                public void setAid(String aid) {
                    this.aid = aid;
                }
        
                public String getAuthor() {
                    return author;
                }
        
                public void setAuthor(String author) {
                    this.author = author;
                }
        
                public int getCoins() {
                    return coins;
                }
        
                public void setCoins(int coins) {
                    this.coins = coins;
                }
        
                public String getCopyright() {
                    return copyright;
                }
        
                public void setCopyright(String copyright) {
                    this.copyright = copyright;
                }
        
                public String getCreate() {
                    return create;
                }
        
                public void setCreate(String create) {
                    this.create = create;
                }
            }
        }
        
      3. 實現解析

        private void specialJsonParse() {
            String json = "{\n" +
                    "    \"code\": 0,\n" +
                    "    \"list\": {\n" +
                    "        \"0\": {\n" +
                    "            \"aid\": \"9698756\",\n" +
                    "            \"author\": \"嗶哩嗶哩番劇\",\n" +
                    "            \"copyright\": \"Copy\",\n" +
                    "            \"create\": \"2017-04-08 18:39\",\n" +
                    "            \"coins\": 22043\n" +
                    "        },\n" +
                    "        \"1\": {\n" +
                    "            \"aid\": \"9854952\",\n" +
                    "            \"author\": \"嗶哩嗶哩番劇\",\n" +
                    "            \"copyright\": \"Copy\",\n" +
                    "            \"create\": \"2017-04-15 15:29\",\n" +
                    "            \"coins\": 16991\n" +
                    "        }\n" +
                    "    }\n" +
                    "}";
            FilmInfo filmInfo = new FilmInfo();
        
            try {
                JSONObject jsonObject = new JSONObject(json);
                filmInfo.setCode(jsonObject.optInt("code"));
        
                List<FilmInfo.FilmBean> list = new ArrayList<>();
                JSONObject object = jsonObject.optJSONObject("list");
        
                for(int i = 0; i < object.length(); i++){
                    FilmInfo.FilmBean filmBean = new FilmInfo.FilmBean();
                    filmBean.setAid(object.getJSONObject(i+"").getString("aid"));
                    filmBean.setAuthor(object.getJSONObject(i+"").getString("author"));
                    filmBean.setCopyright(object.getJSONObject(i+"").getString("copyright"));
                    filmBean.setCreate(object.getJSONObject(i+"").getString("create"));
                    filmBean.setCoins(object.getJSONObject(i+"").getInt("coins"));
        
                    list.add(filmBean);
                }
        
                filmInfo.setList(list);
        
                tv1.setText(json);
                tv2.setText(filmInfo.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }