JMESPath 密钥可能不存在的路径

JMESPath Path Where Key Might Not Exist

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

给定以下结构:

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

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

[].*.b.c.d

[].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 (||) and the 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)"
]