2

我正在尝试找到一种应用以下过滤器的程序方式。给定以下对象,如何获取包含 child 的所有顶级键c2

{
  "a1" : {
    "b" : {
      "c1": {},
      "c2": {}
    }
  },
  "a2" : {
    "b" : {
      "c1" : {}
    }
  },
  "a3" : {
    "b" : {
      "c1" : {},
      "c2" : {}
    }
  } 
}

预期结果:

["a1", "a3"]

我需要 JSONPath、JMESPath 或 ObjectPath 语法中的过滤器。

我在 ObjectPath 中尝试过无数种组合,例如 JSONPath$.*[@.b.c2]中的东西$..[?(b.c2)],直至 JMESPath 之类的构造@.* | [?contains(keys(@), 'c2')]-@.*[b.c2] | @都无济于事。

4

1 回答 1

4

在 ObjectPath 中,选择器只对列表起作用,所以 $.*[@.b.c2] 没有什么可做的。像您的示例中这样的嵌套对象很少见,因此我没有实现一种方法来满足您的需求。您可以尝试将您的对象转换为一个数组,如下所示:

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

然后使用选择器。

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

PS。使用来自 Github 的最新 ObjectPath 版本。我在一分钟前修复了一些与空值比较有关的问题。

于 2018-11-30T01:29:25.643 回答