简体   繁体   English

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

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

I need from this: (example)我需要从这个:(示例)

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

Make this:做这个:

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

So delete all except .services.*.version .所以删除除.services.*.version之外的所有内容。 Help please, can't handle it with my knowledge of the JQ.请帮助,以我对 JQ 的了解无法处理它。

If you wish to differentiate between "version" being absent or null:如果您想区分“版本”不存在或为空:

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

Translating your expression .services.*.version quite generically, you could use tostream as follows:非常笼统地翻译你的表达式.services.*.version ,你可以使用tostream如下:

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

Using jq's streaming parser使用 jq 的流解析器

To reduce memory requirements, you could modify the above solution to use jq's streaming parser, either with reduce as above, or with fromstream :为了减少内存需求,您可以修改上述解决方案以使用 jq 的流解析器,或者使用上面的reduce ,或者使用fromstream

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

where program.jq contains:其中 program.jq 包含:

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

.services.*.version.*

Interpreting .services.*.version more broadly so as not to require the terminal component of the path to be .version , simply replace .[-1] == "version" with:更广泛地解释.services.*.version以便不要求路径的终端组件为.version ,只需将.[-1] == "version"替换为:

index("version")

in the above.在上面。

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

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