Фильтрация дочерних элементов во вложенном JsonPath

Я должен проверить следующий 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"
            }]
        }]
    }]
  }
}

В JSON есть два вложенных списка, первый из которых сгруппирован по «СОСТОЯНИЮ» и содержит дочерний список, который содержит значения имен. Мне нужно найти только имена, которые сгруппированы как «Аляска». Я пробовал следующий JsonPath, но он возвращает ноль:

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

Я не пробовал GPath (findAll), но если это лучшее решение, пожалуйста, сообщите.

Заранее спасибо.


person Dighate    schedule 22.01.2017    source источник


Ответы (1)


Вы можете сделать это с помощью встроенного 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']
person tim_yates    schedule 22.01.2017