1. 程式人生 > >Json檔案轉Map(二)之解析節點

Json檔案轉Map(二)之解析節點

說明

    在上一篇部落格中,筆者向大家介紹瞭如何去解析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的節點。筆者這裡只給出了部分的程式碼,後續會將全部程式碼分享。