使用jq:仅选择具有特定子键的父母

时间:2019-02-13 00:22:56

标签: json parent-child jq

示例json:

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

我想返回具有“ build”键而不是“ image”键的服务列表。请注意,构建键的值不是我可以键入的值。

输出应为:[“ web”,“ datadog”]

2 个答案:

答案 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,但是第一个也提供了一种有趣的方式来思考问题。