Json数据解析之原生Json解析

写在前面

Json是一种网络数据格式,解析它的方式除了原生解析之外,还有第三方的解析库,例如:Gson.
之后我也会写一篇来分析一下Gson的用法,不过我现在先上Json的原生解析。
案例数据接口:
http://baobab.kaiyanapp.com/api/v5/index/tab/discovery?udid=bd4602def0ed4576b145297b0bc8dc6c6b414e3b&vc=256&vn=3.14&deviceModel=BLNAL40&first_channel=eyepetizer_zhihuiyun_market&last_channel=eyepetizer_zhihuiyun_market&system_version_code=24

上述数据仅供学习使用,最终权利属于数据提供方本身。

我先以这个比较复杂的数据为例,学会解决复杂的,简单的就跟没问题了。

一、基本的解析语句;

基本格式

{"key":"value","key":{},"key":[{},{},{}]}
一个key对应一个value;

{}中有三种情况:
1.value是基本数据类型+String类型;
2.value是一个Json对象;
3.value是一个Json数组;
只有上面三种情况,所以JSON的解析很简单。下面具体分析:
首先,必须先把从网络上下载下来的String字符串变成JSONObject对象;
代码如下:

JSONObject jsonObject = new JSONObject(jsonString);

遇到直接的值就是情况一
例如:

"adIndex": -1,
"dataType": "HorizontalScrollCard",
"id": 1068,
"shade": false,

解析代码如下:

    dataObject.optInt("count")

dataObject就是这个"count"key所对应的目标所在的JSONObject,optXXX();
XXX对应不同的类型;
而且还有getXXX()和optXXX()两种方法都可以进行解析;

两者区别:
简单说,就是getXXX()内容为空就报异常,optXXX()不报异常。
optString和getString区别 - 少清先生 - CSDN博客 https://blog.csdn.net/sinat_32089827/article/details/77572389?locationNum=6&fps=1

遇到{}就是JSONObject

情况大概有以下两种:
1.将String字符串转化为JSONObject对象;
2.将{}或JSONArray中的{}包裹住的内容转化为JSONObject对象;

情况一:

JSONObject jsonObject = new JSONObject(jsonString);

情况二:

for (int j = 0; j < itemListInter.length(); j++) {
    JSONObject bannerItem = itemListInter.optJSONObject(j);
 }

遇到[]就是JSONArray
代码如下:

  JSONArray itemList = jsonObject.getJSONArray("itemList");

上述就是原生解析的基本解析方式,现在我们来看一个RecyclerView多布局的Json数据应该怎么解析,所使用的就是上面的数据,再次声明,上述数据仅供学习使用。
具体代码如下:(这一步我们只考虑将你需要的数据拿出来,从String类型的数据变成你需要传入RecyclerView的List类型的数据。)

 private List> getListFromJsonString(String jsonString) throws JSONException {
        List> mainClidList = new ArrayList<>();
        JSONObject jsonObject = new JSONObject(jsonString);
        JSONArray itemList = jsonObject.getJSONArray("itemList");
        for (int i = 0; i < itemList.length(); i++) {
            HashMap mainClidItemData = new HashMap<>();
            JSONObject itemObject = itemList.optJSONObject(i);
            JSONObject dataObject = itemObject.optJSONObject("data");
            //情况一:horizontalScrollCard 图片必须是个数组,重新写。
            if (itemObject.optString("type").equals("horizontalScrollCard")) {
                //banner的图片数目、类型、图片
                mainClidItemData.put("count", dataObject.optInt("count"));
                mainClidItemData.put("type", itemObject.optString("type"));
                JSONArray itemListInter = dataObject.optJSONArray("itemList");
                for (int j = 0; j < itemListInter.length(); j++) {
                    JSONObject bannerItem = itemListInter.optJSONObject(j);
                    JSONObject data = bannerItem.optJSONObject("data");
                    mainClidItemData.put("image" + j, data.optString("image"));
                }

            }
            //情况二:textCard
            if (itemObject.optString("type").equals("textCard")) {
                if (dataObject.optString("type").equals("header5")) {
                    //将内容设置一下
                    mainClidItemData.put("text", dataObject.optString("text"));
                    mainClidItemData.put("type", dataObject.optString("type"));
                }
                //情况四:textCard  footer2
                if (dataObject.optString("type").equals("footer2")) {
                    //将内容设置
                    mainClidItemData.put("text", dataObject.optString("text"));
                    mainClidItemData.put("type", dataObject.optString("type"));
                }
            }
            //情况三:briefCard
            if (itemObject.optString("type").equals("briefCard")) {
                //将icon、title、description装进去
                mainClidItemData.put("icon", dataObject.optString("icon"));
                mainClidItemData.put("title", dataObject.optString("title"));
                mainClidItemData.put("description", dataObject.optString("description"));
                mainClidItemData.put("type", itemObject.optString("type"));

            }
            //情况五:暂时先解析到这一步,验证一下;followCard
            if (itemObject.optString("type").equals("followCard")) {
                //icon、title、description、homepage、
                mainClidItemData.put("type", itemObject.optString("type"));

                JSONObject header = dataObject.optJSONObject("header");
                mainClidItemData.put("title", header.optString("title"));
                mainClidItemData.put("description", header.optString("description"));
                mainClidItemData.put("icon", header.optString("icon"));

                JSONObject content = dataObject.optJSONObject("content");
                JSONObject dataObjectCon = content.optJSONObject("data");
                mainClidItemData.put("id", dataObjectCon.optInt("id"));
                mainClidItemData.put("title", dataObjectCon.optString("title"));

                JSONObject cover = dataObjectCon.optJSONObject("cover");
                mainClidItemData.put("homepage", cover.optString("feed"));
                //header
                JSONObject author = dataObjectCon.optJSONObject("author");
                mainClidItemData.put("authordescription", author.optString("description"));
                mainClidItemData.put("icon", author.optString("icon"));
                mainClidItemData.put("name", author.optString("name"));
                mainClidItemData.put("concategory", dataObjectCon.optString("category"));
                mainClidItemData.put("condescription", dataObjectCon.optString("description"));
                mainClidItemData.put("contitle", dataObjectCon.optString("title"));
                JSONArray tags = dataObjectCon.optJSONArray("tags");
                mainClidItemData.put("tagsSize", tags.length());
                for (int j = 0; j < tags.length(); j++) {
                    JSONObject tagsJsonObject = tags.optJSONObject(j);
                    mainClidItemData.put("headerImage" + j, tagsJsonObject.optString("headerImage"));
                }
                JSONObject consumption = dataObjectCon.optJSONObject("consumption");
                mainClidItemData.put("collectionCount", consumption.optString("collectionCount"));
                mainClidItemData.put("replyCount", consumption.optString("replyCount"));
                mainClidItemData.put("shareCount", consumption.optString("shareCount"));
            }
            //情况六:videoSmallCard
            if (itemObject.optString("type").equals("videoSmallCard")) {
                //三个
                mainClidItemData.put("category", dataObject.optString("category"));
                mainClidItemData.put("title", dataObject.optString("title"));
                mainClidItemData.put("id", dataObject.optInt("id"));
                mainClidItemData.put("title", dataObject.optString("title"));
                JSONObject cover = dataObject.optJSONObject("cover");
                mainClidItemData.put("homepage", cover.optString("feed"));
                mainClidItemData.put("type", itemObject.optString("type"));
                //header
                JSONObject author = dataObject.optJSONObject("author");
                mainClidItemData.put("authordescription", author.optString("description"));
                mainClidItemData.put("icon", author.optString("icon"));
                mainClidItemData.put("name", author.optString("name"));
                mainClidItemData.put("concategory", dataObject.optString("category"));
                mainClidItemData.put("condescription", dataObject.optString("description"));
                mainClidItemData.put("contitle", dataObject.optString("title"));
                JSONArray tags = dataObject.optJSONArray("tags");
                mainClidItemData.put("tagsSize", tags.length());
                for (int j = 0; j < tags.length(); j++) {
                    JSONObject tagsJsonObject = tags.optJSONObject(j);
                    mainClidItemData.put("headerImage" + j, tagsJsonObject.optString("headerImage"));
                }
                JSONObject consumption = dataObject.optJSONObject("consumption");
                mainClidItemData.put("collectionCount", consumption.optString("collectionCount"));
                mainClidItemData.put("replyCount", consumption.optString("replyCount"));
                mainClidItemData.put("shareCount", consumption.optString("shareCount"));

            }
            //情况七+十三
            if (itemObject.optString("type").equals("squareCardCollection")) {
                //title、count、itemList
                JSONObject header = dataObject.optJSONObject("header");
                mainClidItemData.put("title", header.optString("title"));
                mainClidItemData.put("count", dataObject.optInt("count"));
                JSONArray itemDataList = dataObject.optJSONArray("itemList");
                for (int j = 0; j < itemDataList.length(); j++) {
                    //image
                    JSONObject itembanner = itemDataList.optJSONObject(j);
                    JSONObject data = itembanner.optJSONObject("data");
                    //情况十三:squareCardCollection之下的ItemCollection之下的banner
                    if (itembanner.optString("type").equals("banner")) {
                        mainClidItemData.put("image" + j, data.optString("image"));
                        if (j == 0) {
                            mainClidItemData.put("type", "squareCardCollectionbanner");
                        }

                    }
                    //情况七: 带标题的轮播图  squareCardCollection之下的ItemCollection之下的follow
                    //
                    if (itembanner.optString("type").equals("followCard")) {
                        JSONObject headerObject = data.optJSONObject("header");
                        mainClidItemData.put("icon" + j, headerObject.optString("icon"));
                        mainClidItemData.put("headertitle" + j, headerObject.optString("title"));
                        mainClidItemData.put("description" + j, headerObject.optString("description"));

                        JSONObject content = data.optJSONObject("content");
                        JSONObject dataObjectInter = content.optJSONObject("data");
                        mainClidItemData.put("id" + j, dataObjectInter.optInt("id"));
                        mainClidItemData.put("slogan" + j, dataObjectInter.optString("slogan"));
                        mainClidItemData.put("title" + j, dataObjectInter.optString("title"));
                        JSONObject cover = dataObjectInter.optJSONObject("cover");

                        mainClidItemData.put("feed" + j, cover.optString("feed"));
                        if (j == 0) {
                            mainClidItemData.put("type", "squareCardCollectionfollowCard");
                        }

                    }


                }

            }
            //情况八:videoCollectionWithBrief
            if (itemObject.optString("type").equals("videoCollectionWithBrief")) {
                //count、icon、title、description、itemList
                mainClidItemData.put("count", dataObject.optInt("count"));
                JSONObject header = dataObject.optJSONObject("header");
                mainClidItemData.put("icon", header.optString("icon"));
                mainClidItemData.put("title", header.optString("title"));
                mainClidItemData.put("description", header.optString("description"));
                JSONArray itemDataList = dataObject.optJSONArray("itemList");
                for (int j = 0; j < itemDataList.length(); j++) {
                    //category、title、feed
                    JSONObject itembanner = itemDataList.optJSONObject(j);
                    JSONObject data = itembanner.optJSONObject("data");
                    mainClidItemData.put("id" + j, data.optInt("id"));
                    mainClidItemData.put("description" + j, data.optString("description"));
                    mainClidItemData.put("category" + j, data.optString("category"));
                    mainClidItemData.put("title" + j, data.optString("title"));
                    JSONObject cover = data.optJSONObject("cover");
                    mainClidItemData.put("feed" + j, cover.optString("feed"));
                }
                mainClidItemData.put("type", itemObject.optString("type"));
            }
            //情况九:图片广告 banner3
            if (itemObject.optString("type").equals("banner3")) {
                //icon、title、description、image、card
                JSONObject header = dataObject.optJSONObject("header");
                JSONObject label = dataObject.optJSONObject("label");

                mainClidItemData.put("icon", header.optString("icon"));
                mainClidItemData.put("title", header.optString("title"));
                mainClidItemData.put("description", header.optString("description"));
                mainClidItemData.put("image", dataObject.optString("image"));
                mainClidItemData.put("card", label.optString("card"));

                mainClidItemData.put("type", itemObject.optString("type"));
            }
            //情况十:DynamicInfoCard之下的reply
            if (itemObject.optString("type").equals("DynamicInfoCard")) {
                //icon、name、de、image、title、category、zan、Data、
                //playUrl
                if (dataObject.optString("dynamicType").equals("reply")) {
                    mainClidItemData.put("createDate", dataObject.optString("createDate"));
                    mainClidItemData.put("type", itemObject.optString("type"));

                    JSONObject replyObject = dataObject.optJSONObject("reply");
                    mainClidItemData.put("likeCount", replyObject.optString("likeCount"));

                    JSONObject simpleVideo = dataObject.optJSONObject("simpleVideo");
                    mainClidItemData.put("category", simpleVideo.optString("category"));
                    mainClidItemData.put("title", simpleVideo.optString("title"));
                    mainClidItemData.put("id",simpleVideo.optInt("id"));
                    mainClidItemData.put("description", simpleVideo.optString("description"));

                    JSONObject cover = simpleVideo.optJSONObject("cover");
                    mainClidItemData.put("feed", cover.optString("feed"));

                    JSONObject user = dataObject.optJSONObject("user");
                    mainClidItemData.put("nickname", user.optString("nickname"));
                    mainClidItemData.put("cover", user.optString("avatar"));
                    //P
                    mainClidItemData.put("playUrl", simpleVideo.optString("playUrl"));

                }

            }
            //情况十一:autoPlayFollowCard 之下的FollowCard   暂时没有找到对应的UI布局 先不写
            if (itemObject.optString("type").equals("autoPlayFollowCard")) {
                if (dataObject.optString("dataType").equals("FollowCard")) {
                    //暂时没有找到对应的UI
                    mainClidItemData.put("type", itemObject.optString("type"));
                }

            }
            //情况十二:banner
            if (itemObject.optString("type").equals("banner")) {
                //图片
                mainClidItemData.put("image", dataObject.optString("image"));
                mainClidItemData.put("type", itemObject.optString("type"));
            }
            //十三 autoPlayVideoAd
            if (itemObject.optString("type").equals("autoPlayVideoAd")) {
                JSONObject detail = dataObject.optJSONObject("detail");
                mainClidItemData.put("title", detail.optString("title"));
                mainClidItemData.put("icon", detail.optString("icon"));
                mainClidItemData.put("description", detail.optString("description"));
                mainClidItemData.put("imageUrl", detail.optString("imageUrl"));

                mainClidItemData.put("url", detail.optString("url"));
                mainClidItemData.put("type", itemObject.optString("type"));
            }
            //将每一条数据加载进去;
            mainClidList.add(mainClidItemData);
        }
        return mainClidList;
    }

至此,本篇博客结束,希望大家多多指点。

你可能感兴趣的:(Json数据解析之原生Json解析)