获取未知密钥的内容

时间:2016-03-03 00:22:46

标签: json key jq

我正在尝试获取“url”名称的值,该名称位于我之前不知道的名称下方。例如它不是'name'或'size' - 只是另一个工具生成的字符串 - 例如“x1234”我不知道名字:

"foo": {
  "bar": {
    "x1234": {
      "url": "http://example.com"
    }
  }
}

所以jq“.foo.bar”返回“x1234”片段,但我需要的是它下面的“url”值。我在阅读完文档后尝试过很多东西,但是我无法弄清楚正确的语法。

谁能告诉我哪里出错?

3 个答案:

答案 0 :(得分:4)

一种方法是使用..。例如,如果输入是有效的JSON:

$ jq '.. | .url? | select(.)' input.json
"http://example.com"

或等效(并且更容易打字):

$ jq '.. | .url? // empty' input.json

答案 1 :(得分:1)

这是一个使用 tostream 的解决方案。如果filter.jq包含

  tostream
| select(length==2) as [$p,$v]
| if $p[-1] == "url" and ($v|endswith(".zip")) then $v else empty end

并且如果data.json包含(注释外部{}以使示例合法JSON,则添加第二个条目以演示排除.zip中未结束的值,如{{ "foo": { "bar": { "x1234": { "url": "http://example.com" }, "x1234xxx": { "url": "http://example.com/file.zip" } } } } 中的后续评论中所述3}}的答案)

jq -M -f filter.jq data.json

然后命令

"http://example.com/file.zip"

产生

onCreate

答案 2 :(得分:1)

假设foobar已知,您可以 .foo.bar[].url

如果bar也未知,请执行以下操作 .foo[][].url

相关问题