我正在尝试获取“url”名称的值,该名称位于我之前不知道的名称下方。例如它不是'name'或'size' - 只是另一个工具生成的字符串 - 例如“x1234”我不知道名字:
"foo": {
"bar": {
"x1234": {
"url": "http://example.com"
}
}
}
所以jq“.foo.bar”返回“x1234”片段,但我需要的是它下面的“url”值。我在阅读完文档后尝试过很多东西,但是我无法弄清楚正确的语法。
谁能告诉我哪里出错?
答案 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)
假设foo
和bar
已知,您可以
.foo.bar[].url
如果bar
也未知,请执行以下操作
.foo[][].url