2014-05-14 21 views
1
[ 
{ 
    "createTime": "2014-05-12 04:51:46.513343", 
    "powered": false, 
    "description": "s", 
    "current": false, 
    "children": [ 
     { 
      "createTime": "2014-05-13 03:50:43.050442", 
      "powered": false, 
      "description": "Snapshot description", 
      "current": false, 
      "children": [ 
       { 
        "createTime": "2014-05-13 03:57:08.209319", 
        "powered": false, 
        "description": "s", 
        "current": false, 
        "children": [ 
         { 
          "createTime": "2014-05-13 04:27:00.646064", 
          "powered": false, 
          "description": "s", 
          "current": false, 
          "label": "snap3" 
         }, 
         { 
          "createTime": "2014-05-13 21:00:16.374178", 
          "powered": false, 
          "description": "sd", 
          "current": false, 
          "label": "sddsds" 
         } 
        ], 
        "label": "snap2" 
       } 
      ], 
      "label": "snapshot-name5" 
     }, 
     { 
      "createTime": "2014-05-14 00:49:33.415858", 
      "powered": false, 
      "description": "a", 
      "current": false, 
      "children": [ 
       { 
        "createTime": "2014-05-14 02:35:10.076829", 
        "powered": false, 
        "description": "sdfsdfsdf", 
        "current": true, 
        "label": "ssfsdf" 
       } 
      ], 
      "label": "assa" 
     } 
    ], 
    "label": "snap1" 
} 
] 

在這裏我有標籤'snap2'作爲輸入,我是否常規操作?我搜索了很多東西,但我無法找到解決方案。Groovy:我如何搜索帶鍵值的JSON並找到它的子元素groovy

如果我能從你們任何一方獲得建議,那將是非常棒的。

回答

3

假設你的JSON是在一個字符串jsonTxt,你可以這樣做:

def json = ​new groovy.json.JsonSlurper().parseText(jsonTxt) 

def recursiveChildrenScan(map, key, value) { 
    if(!map) { null } 
    else if(map[ key ] == value) { map.children } 
    else { map.children.findResult { recursiveChildrenScan(it, key, value) } } 
} 

println json.findResult { recursiveChildrenScan(it, 'label', 'snap2') }​?.label​ 
+0

三江源這麼多,絕對真棒! – jophine

0
find_recursive(new groovy.json.JsonSlurper().parseText(your_json_here)) 

def find_recursive(a) { 
    a.collect {(it.label == "snap2") ? it.children.collect {it.label} : find_recursive(it.children) }.flatten() 
} 
+0

感謝kunal,爲您的時間。我沒有試過這段代碼。我希望有同樣問題的人可以嘗試這個並提供他們的反饋。 – jophine