根据子项过滤JSON对象

时间:2018-11-27 16:16:36

标签: jsonpath jmespath objectpath

我正在尝试找到一种应用以下过滤器的方法。 给定以下对象,如何获取所有包含子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>

1 个答案:

答案 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版本。一分钟前,我修复了一些空比较问题。