在嵌套的 JsonPath 中过滤 children
Filtering children in a Nested 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 中有两个嵌套列表,第一个由 "STATE" 分组,它包含 children 列表,其中包含名称的值。
我只需要找到分组为 'Alaska' 的名称。
我尝试了以下 JsonPath 但是,它 returns null:
$.data..children[?(@nodes.value == 'Alaska')].children[?(@nodes.key=='NAME').value
我没有尝试过GPath(findAll),如果有更好的解决方案,请指教。
提前致谢。
您可以使用内置的 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']
我必须验证以下 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" 分组,它包含 children 列表,其中包含名称的值。 我只需要找到分组为 'Alaska' 的名称。 我尝试了以下 JsonPath 但是,它 returns null:
$.data..children[?(@nodes.value == 'Alaska')].children[?(@nodes.key=='NAME').value
我没有尝试过GPath(findAll),如果有更好的解决方案,请指教。
提前致谢。
您可以使用内置的 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']