写在前面
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;
}
至此,本篇博客结束,希望大家多多指点。
网友评论