2

假设我有以下 json 对象:

{
  "d": {
    "e": {
      "bar": 2
    }
  },
  "a": {
    "b": {
      "c": {
        "foo": 1
      }
    }
  }
}

我想在不输入的情况下获取值 foo'.a.b.c.foo'

我意识到我可以做到…… echo '{ "a":{"b":{"c":{ "foo":1}}},"d":{"e":{"bar":2}}}' | jq '.[][][].foo'但是 jq 中有递归的狂野吗?喜欢 **?我确定jq不支持*,有没有办法让jq支持jsonpath?或者甚至可能只是另一个支持 json 路径的 cli 工具?

4

1 回答 1

3

在 jq 1.4 中,您可以这样做:

$ jq '..|.foo?' file.json

如果你坚持使用 1.3,你可以使用

$ jq 'recurse(if type == "array" or type == "object" then .[] else empty end) | if type == "object" then . else empty end | .foo' file.json

这有点拗口……这就是为什么 1.4 有..,它会向下递归遍历 中的所有可迭代对象.,以及?运算符,它不会费心索引那些不可能的东西。

于 2014-06-19T06:37:53.830 回答