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<HashMap<String, Object>> getListFromJsonString(String jsonString) throws JSONException {
        List<HashMap<String, Object>> mainClidList = new ArrayList<>();
        JSONObject jsonObject = new JSONObject(jsonString);
        JSONArray itemList = jsonObject.getJSONArray("itemList");
        for (int i = 0; i < itemList.length(); i++) {
            HashMap<String, Object> 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;
    }

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容