【问题标题】:Using jq: Only select parents with a certain child key使用 jq:仅选择具有特定子键的父母
【发布时间】:2019-02-13 00:22:55
【问题描述】:

示例 json:

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

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

输出应该是:["web", "datadog"]

【问题讨论】:

    标签: json parent-child jq


    【解决方案1】:

    这里有两种工作方式:

    1.

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

    (下钻到.services,记为$services以备后用,获取key列表,选择$services中对应的value有buildkey)。

    2.

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

    (向下钻取到.services,转换为{"key": ..., "value": ...} 对象的列表,选择.value 具有build 键的对象,并为每个对象返回.key)。

    第二个可能是更惯用的 jq,但第一个也提供了一种有趣的方式来思考这个问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        相关资源
        最近更新 更多