我有这个框架JSON文件,我需要使用externalids.system=='HQ2'
使用JSONPath进行过滤。我也在使用Goessner。
{
"meta": {
"numFound": 2
},
"data": [
{
"id": "11111",
"type": "PRODUCT_GROUP",
"values": [
{
"showvalues": [
"ObjectPosition"
],
"value": "4",
"attributeid": "gd4d20ffc-0374-4764-8b01-19b2e3d9d084"
}
],
"_links": [
{
"rel": "self"
}
],
"externalids": [
{
"system": "HQ1"
}
]
},
{
"id": "22222",
"type": "PRODUCT_GROUP",
"values": [
{
"showvalues": [
"ObjectPosition"
],
"value": "4",
"attributeid": "gd4d20ffc-0374-4764-8b01-19b2e3d9d084"
}
],
"_links": [
{
"rel": "self"
}
],
"externalids": [
{
"system": "HQ2"
}
]
}
]
}
有人可以帮助我为什么这不起作用吗?
$.data[?(@.externalids[?(@.system == 'HQ2')])].values
基本上,我需要所有externalids.system=='HQ2'
的values
.
我知道这很老了,但有人可能仍然感兴趣,事实证明,它实际上是可行的!
好的,根据要求,使用 Goessner 的实现,我们可以从具有如下
externalids.system==HQ2
属性的数据对象中查询values
:$.data[?( @.externalids && @.externalids.some(e => e.system=='HQ2') )].values
这有点棘手:过滤
externalids
后,使用 JS 脚本评估使用带有箭头函数的.some()
(ES5( 搜索项目。整洁,哈?在Goessner选项卡上在线测试它。
在Jayway的JsonPath实现中,我们可以使用相同的想法,但需要稍微不同的语法:
$.data[?(@.externalids && @..system contains 'HQ2')].values
虽然此解决方案非常相似,但由于我们正在递归搜索
system
属性,因此更容易出现误报。使用同一站点在 Jayway 选项卡上对其进行测试。
而且,如前所述,如果我们使用像JSONPath-Plus这样功能更丰富的实现,事情就会变得更容易,例如利用
^
父节点运算符:$..externalids[?(@.system==='HQ2')]^^^.values
获取所有
externalids
对象并过滤属性,然后多次向上,直到我们在data
下有对象用于过滤values
。这可以在这里在线测试。
因此,如果我们愿意应用某些解决方法,这是可以实现的。