说明
在上一篇博客中,笔者向大家介绍了如何去解析Json并转化为Map。这一篇的博客,笔者主要是介绍如何去提取嵌套Json的节点并保存。例如以下的Json格式:
{
"error": 0,
"status": "success",
"results": [{
"currentCity": "青岛",
"index": [{
"title": "穿衣",
"zs": "较冷",
"tipt": "穿衣指数",
"des": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"
}, {
"title": "紫外线强度",
"zs": "最弱",
"tipt": "紫外线强度指数",
"des": "属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。",
"index7": [{
"title": "穿衣",
"zs": "较冷",
"tipt": "穿衣指数",
"des": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。",
"index8": [{
"title": "穿衣"
}, {
"title": "紫外线强度",
"zs": "最弱",
"tipt": "紫外线强度指数",
"des": "属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"
}]
}, {
"title": "紫外线强度",
"zs": "最弱",
"tipt": "紫外线强度指数",
"des": "属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"
}]
}],
"index2": [{
"title": "穿衣",
"zs": "较冷",
"tipt": "穿衣指数",
"des": "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"
}, {
"title": "紫外线强度",
"zs": "最弱",
"tipt": "紫外线强度指数",
"des": "属弱紫外线辐射天气,无需特别防护。若长期在户外,建议涂擦SPF在8-12之间的防晒护肤品。"
}],
}]
}
这个时候,我们需要提取节点,将提取的节点格式保存为如下形式:
- index8=results>index>index7>
- index7=results>index>
- index=results>
- index2=results>
- results=null
分析及实现
我们要将解析到的节点保存到Map中,所以要行定义个Map.其次,我们还是一样的按照不同的对象来解析并放入到Map中。
- 如果是JSONArray对象,我们需要在上一篇博客的方法中添加以下代码:
//如果内层还是数组的话,继续解析 if (v instanceof JSONArray) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Iterator<JSONObject> it = ((JSONArray) v).iterator(); while (it.hasNext()) { Object o = it.next(); if(o instanceof JSONObject) { //如果节点不存在,则断续添加 if(!reserveMap.containsKey(k.toString())) { // System.out.println(k.toString()+"*****oldStr3:"+oldStr+"**present paranmeters:"+nodeMap.get(oldStr)); returnNodeMap.put(k.toString(), reserveMap.get(fatherName)); //返回节点中如果存在节点,则取出修改为当前节点信息 if(returnNodeMap.containsKey(k.toString())) { String getResValue = returnNodeMap.get(k.toString()); //已经存在的返回节点不能为空 if(getResValue != null && !"".equals(getResValue)) { currNode= (getResValue.endsWith(">")? getResValue : getResValue+">")+ k.toString()+">"; } else { currNode +=k.toString()+">"; } } //否则添加当前节点 else { currNode +=k.toString()+">"; } reserveMap.put(k.toString(),currNode); } JSONObject json2 = (JSONObject) o; list.add(json2Map(json2.toString(),index,k.toString(),currNode,reserveMap,returnNodeMap)); } } //保存节点 if(!reserveMap.containsKey(k.toString())) { //System.out.println(k.toString()+">>>>oldStr2:"+oldStr+">>>present paranmeters:"+nodeMap.get(oldStr)); returnNodeMap.put(k.toString(), reserveMap.get(fatherName)); currNode +=k.toString()+">"; reserveMap.put(k.toString(), currNode); } map.put(k.toString(), list); }
- 如果是JsonObject对象,我们需要添加以下代码:
//还是JsonObject对象,则再次遍历 else if(isJsonObject(v.toString())) { //保存返回节点和当前节点 if(!reserveMap.containsKey(k.toString())) { //System.out.println(k.toString()+"@@@@@@oldStr1:"+oldStr+">>>present paranmeters:"+nodeMap.get(oldStr)); returnNodeMap.put(k.toString(), reserveMap.get(fatherName)); currNode +=k.toString() + ">"; reserveMap.put(k.toString(), currNode); } json2Map(v.toString(),index,k.toString(),currNode,reserveMap,returnNodeMap); map.put(k.toString(), v); }
- 如果是其它的,则不做任何处理。
小结
以上就是笔者分享的如何解析嵌套Json的节点。笔者这里只给出了部分的代码,后续会将全部代码分享。