繁体   English   中英

如何使用 JQ 从 JSON 中删除不必要的项目?

[英]How to remove unnecessary items from an JSON with JQ?

我需要从这个:(示例)

{
  "jobs": [
      {},
      {}
    ],
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "foo": true,
      "version": "master"
    },
    "service-3": {
      "bar": "baz"
    }
  }
}

做这个:

{
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "version": "master"
    }
  }
}

所以删除除.services.*.version之外的所有内容。 请帮助,以我对 JQ 的了解无法处理它。

如果您想区分“版本”不存在或为空:

{services}
| .services |= map_values(select(has("version")) | {version} )

非常笼统地翻译你的表达式.services.*.version ,你可以使用tostream如下:

reduce (tostream
        | select(length==2 and
                 (.[0] | (.[0] == "services" and
                          .[-1] == "version")))) as $pv (null;
    setpath($pv[0]; $pv[1]) )

使用 jq 的流解析器

为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,或者使用上面的reduce ,或者使用fromstream

jq -n --stream -f program.jq input.json

其中 program.jq 包含:

fromstream(inputs
    | select( if length == 2
              then .[0] | (.[0] == "services" and
                           .[-1] == "version")
              else . end ) )

.services.*.version.*

更广泛地解释.services.*.version以便不要求路径的终端组件为.version ,只需将.[-1] == "version"替换为:

index("version")

在上面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM