美文网首页
Json数据解析之原生Json解析

Json数据解析之原生Json解析

作者: 风卷晨沙 | 来源:发表于2018-10-21 16:25 被阅读23次

    写在前面

    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;
        }
    

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

    相关文章

      网友评论

          本文标题:Json数据解析之原生Json解析

          本文链接:https://www.haomeiwen.com/subject/ofgbaftx.html