Goessner JSONPath 嵌套过滤器以返回同级节点



我有这个框架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.

我知道这很老了,但有人可能仍然感兴趣,事实证明,它实际上是可行的!

  1. 好的,根据要求,使用 Goessner 的实现,我们可以从具有如下externalids.system==HQ2属性的数据对象中查询values

    $.data[?( @.externalids && @.externalids.some(e => e.system=='HQ2') )].values
    

    这有点棘手:过滤externalids后,使用 JS 脚本评估使用带有箭头函数的.some()(ES5( 搜索项目。整洁,哈?在Goessner选项卡上在线测试它。


  1. 在Jayway的JsonPath实现中,我们可以使用相同的想法,但需要稍微不同的语法:

    $.data[?(@.externalids && @..system contains 'HQ2')].values
    

    虽然此解决方案非常相似,但由于我们正在递归搜索system属性,因此更容易出现误报。使用同一站点在 Jayway 选项卡上对其进行测试。


  1. 而且,如前所述,如果我们使用像JSONPath-Plus这样功能更丰富的实现,事情就会变得更容易,例如利用^父节点运算符:

    $..externalids[?(@.system==='HQ2')]^^^.values
    

    获取所有externalids对象并过滤属性,然后多次向上,直到我们在data下有对象用于过滤values。这可以在这里在线测试。

因此,如果我们愿意应用某些解决方法,这是可以实现的。

最新更新