首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用JQ从JSON中删除不必要的项?

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

Stack Overflow用户
提问于 2020-11-16 10:00:38
回答 2查看 63关注 0票数 0

我需要这样做:(示例)

代码语言:javascript
复制
{
  "jobs": [
      {},
      {}
    ],
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "foo": true,
      "version": "master"
    },
    "service-3": {
      "bar": "baz"
    }
  }
}

这样做:

代码语言:javascript
复制
{
  "services": {
    "service-1": {
      "version": "master"
    },
    "service-2": {
      "version": "master"
    }
  }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-16 11:46:18

通常,您可以使用tostream来转换表达式.services.*.version,如下所示:

代码语言:javascript
复制
reduce (tostream
        | select(length==2 and
                 (.[0] | (.[0] == "services" and
                          .[-1] == "version")))) as $pv (null;
    setpath($pv[0]; $pv[1]) )

使用jq的流解析器

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

代码语言:javascript
复制
jq -n --stream -f program.jq input.json

其中,program.jq包含:

代码语言:javascript
复制
fromstream(inputs
    | select( if length == 2
              then .[0] | (.[0] == "services" and
                           .[-1] == "version")
              else . end ) )

.services.*.version.*

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

代码语言:javascript
复制
index("version")

在上面。

票数 1
EN

Stack Overflow用户

发布于 2020-11-16 11:17:56

如果您希望区分"version“是不存在的还是null:

代码语言:javascript
复制
{services}
| .services |= map_values(select(has("version")) | {version} )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64851773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档