示例json:
{
"version": "3",
"services": {
"web": {
"build": "web"
},
"redis": {
"image": "redis"
},
"datadog": {
"build": "datadog"
},
"another": {
"image": "mysql"
}
}
}
我想返回具有“ build”键而不是“ image”键的服务列表。请注意,构建键的值不是我可以键入的值。
输出应为:[“ web”,“ datadog”]
答案 0 :(得分:2)
这是第三种方法,值得注意的是它忽略了上游:
[(paths(scalars)
| select(.[-1] == "build")) as $p
| getpath($p)]
答案 1 :(得分:1)
有两种工作方式:
1。
jq '.services
| . as $services
| keys_unsorted
| map( select($services[.] | has("build")) )'
(向下钻取到.services
,记住它为$services
,以备后用,获取键列表,然后选择键,使$services
中的对应值具有一个{{ 1}}键。
2。
build
(向下钻取到jq '.services
| to_entries
| map( select(.value | has("build")) | .key)'
,转换为.services
对象的列表,选择{"key": ..., "value": ...}
具有.value
键的对象,然后返回{{1 }})。
第二个可能是比较惯用的jq,但是第一个也提供了一种有趣的方式来思考问题。