Json檔案轉Map(二)之解析節點
阿新 • • 發佈:2018-12-17
說明
在上一篇部落格中,筆者向大家介紹瞭如何去解析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的節點。筆者這裡只給出了部分的程式碼,後續會將全部程式碼分享。