根据子键筛选 JSON 个对象

Filter JSON object based on children keys

我正在尝试找到一种应用以下过滤器的程序方法。 给定以下对象,我如何获得包含子 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] | @ 之类的结构 - 都无济于事.

在 ObjectPath 中,选择器只对列表有效,所以 $.*[@.b.c2] 没有任何作用。像你的例子中那样的嵌套对象很少见,所以我没有实现一种方法来做你需要的事情。您可以尝试将对象转换为如下数组:

[
  {
    "name": "a1",
    "b": {
      "c1": {},
      "c2": {}
    }
  },
  {
    "name": "a2",
    "b": {
      "c1": {}
    }
  },
  {
    "name": "a3",
    "b": {
      "c1": {},
      "c2": {}
    }
  }
]

然后使用选择器。

$.*[@.b.c2 不为空].name

PS。使用来自 Github 的最新 ObjectPath 版本。我刚刚在一分钟前解决了空值比较的一些问题。