使用 jq:仅 select parents 带有某个 child 键

Using jq: Only select parents with a certain child key

示例json:

{
  "version": "3",
  "services": {
    "web": {
      "build": "web"
    },
    "redis": {
      "image": "redis"
    },
    "datadog": {
      "build": "datadog"
    },
    "another": {
      "image": "mysql"
    }
  }
}

我想要 return 具有 "build" 键而不是 "image" 键的服务列表。请注意,构建密钥的值不是我可以关闭的值。

输出应为:["web"、"datadog"]

这里有两种工作方式:

1.

jq '.services
    | . as $services
    | keys_unsorted
    | map( select($services[.] | has("build")) )'

(向下钻取.services,记为$services以备后用,得到key列表,select使得[=13中对应的值=] 有一个 build 键)。

2.

jq '.services
    | to_entries
    | map( select(.value | has("build")) | .key)'

(向下钻取到 .services,转换为 {"key": ..., "value": ...} 对象的列表,select .value 具有 build 键的对象,和 return 每个 .key)。

第二个可能更符合地道的 jq,但第一个也提供了一种有趣的思考问题的方式。

这是第三种方法,以忽略上游而著称:

[(paths(scalars) 
  | select(.[-1] == "build")) as $p
 | getpath($p)]