密钥可能不存在的 JMESPath 路径

问题描述

我有一个奇怪的 JSON 结构(出于安全原因,我无法提供实际数据,但我可以提供结构,这才是真正重要的)。

鉴于以下结构:

[
  {
    "a": {
      "b": {
        "c": "d"
      }
    }
  },{
    "b": {
      "c": "d"
    }
  },]

我需要有一种方法可以在不知道路径是否包含 c 的情况下始终到达 {​​{1}}。类似的东西:

a

[].*.b.c.d

有什么想法吗?

作为参考,我使用的是 python 的 jmespath 库。

解决方法

给定 JSON:

[
  {
    "a": {
      "b": {
        "c": "d (of a.b.c)"
      }
    }
  },{
    "b": {
      "c": "d (of b.c)"
    }
  },{
    "z": {
      "b": {
        "c": "d (of z.b.c)"
      }
    }
  }
]

您可以结合使用 or expression (||) 和 flatten operator ([]) 来实现您想要的效果。

所以表达式:

[][*.b || b] [] []

在上面的 JSON 上会产生:

[
  {
    "c": "d (of a.b.c)"
  },{
    "c": "d (of b.c)"
  },{
    "c": "d (of z.b.c)"
  }
]

请注意,我们必须使用 flatten 运算符两次,因为它的结构有时有两层,有时有三层。


如果您只想要 c 的值:

[][*.b || b] [] [].c

将产生:

[
  "d (of a.b.c)","d (of b.c)","d (of z.b.c)"
]