2017-01-22 7 views
1

:2つのネストされたリストは、JSON最初にありますフィルタリング子供

{ 
    "data": { 
    "children": [{ 
     "nodes": [{ 
      "key": "STATE", 
      "value": "Alaska" 
     }], 
     "children": [{ 
      "nodes": [{ 
       "key": "STATE", 
       "value": "Alaska" 
      }, { 
       "key": "NAME", 
       "value": "Jack" 
      }, { 
       "key": "AGE", 
       "value": "13" 
      }] 
     }, { 
      "nodes": [{ 
       "key": "STATE", 
       "value": "Alaska" 
      }, { 
       "key": "NAME", 
       "value": "Jill" 
      }, { 
       "key": "AGE", 
       "value": "23" 
      }] 
     }] 
    }, { 
     "nodes": [{ 
      "key": "STATE", 
      "value": "Texas" 
     }], 
     "children": [{ 
      "nodes": [{ 
       "key": "STATE", 
       "value": "Texas" 
      }, { 
       "key": "NAME", 
       "value": "John" 
      }, { 
       "key": "AGE", 
       "value": "23" 
      }] 
     }] 
    }] 
    } 
} 

は「STATE」によってグループ化され、それが名前の値を保持する子どもたちのリストが含まれています。 「アラスカ」としてグループ化された名前だけを見つける必要があります。 は、私は、次のJsonPathを試みたが、それはnullを返してきた。それは、より良い解決策だ場合、

$.data..children[?(@nodes.value == 'Alaska')].children[?(@nodes.key=='NAME').value 

私は試していないGPath(findAllのを)しかし、アドバイスしてください。

ありがとうございます。

答えて

2

あなたは作り付けのGroovy JsonSlurperでそれを行うことができます...あなたのJSONが変数jsonTxt内の文字列であると仮定すると、あなただけ行うことができます。

import groovy.json.* 

def names = new JsonSlurper().parseText(jsonTxt) 
          .data 
          .children 
          .find { 'Alaska' in it.nodes.value } 
          .children 
          .nodes 
          .flatten() 
          .findAll { it.key == 'NAME' } 
          .value 

assert names == ['Jack', 'Jill'] 
+0

私はGpathライブラリをインポートし、驚異を働きました!ありがとう – Dighate