在嵌套的JsonPath中过滤子项

时间:2017-01-22 21:59:25

标签: json groovy soapui jsonpath rest-assured

我必须验证以下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中有两个嵌套列表,首先按" STATE"它包含保存名称值的子列表。 我需要找到分组为“阿拉斯加”的名称。 我尝试了以下JsonPath但它返回null:

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

我还没有尝试过GPath(findAll)但是,如果它是更好的解决方案,请提供建议。

提前致谢。

1 个答案:

答案 0 :(得分: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']