我正在尝试找到一种应用以下过滤器的方法。
给定以下对象,如何获取所有包含子c2
的顶级密钥?
{
"a1" : {
"b" : {
"c1": {},
"c2": {}
}
},
"a2" : {
"b" : {
"c1" : {}
}
},
"a3" : {
"b" : {
"c1" : {},
"c2" : {}
}
}
}
预期结果:
["a1", "a3"]
我需要使用JSONPath,JMESPath或ObjectPath语法的过滤器。
我尝试了ObjectPath中$.*[@.b.c2]
的无数组合,JSONPath中的$..[?(b.c2)]
之类的东西,到JMESPath中的@.* | [?contains(keys(@), 'c2')]
或@.*[b.c2] | @
之类的构造-都无济于事。 / p>
答案 0 :(得分:3)
在ObjectPath中,选择器仅对列表起作用,因此$。* [@。b.c2]没有任何作用。像您的示例中那样的嵌套对象很少见,因此我没有实现所需的方法。您可以尝试将对象转换为如下数组:
[
{
"name": "a1",
"b": {
"c1": {},
"c2": {}
}
},
{
"name": "a2",
"b": {
"c1": {}
}
},
{
"name": "a3",
"b": {
"c1": {},
"c2": {}
}
}
]
然后使用选择器。
$。* [@。b.c2不为空] .name
PS。使用Github的最新ObjectPath版本。一分钟前,我修复了一些空比较问题。