如何使用jq从某些嵌套级别删除或忽略值 maxdepth2

问题描述

我有一个深层嵌套的JSON,它太大了,无法浏览。我想从某个嵌套级别中删除所有项目,最好使用jq

说,JSON是:

{
  "paging": {
    "next": "items?page=12","previous": "items?page=10"
  },"hits": {
    "total": 10200,"max_score": 1,"hits": [
      {
        "id": 1337,"really large struct 1": "with long and complexed nested values"
      },{
        "id": 1338,"really large struct 1": "with long and complexed nested values"
      }
    ]
  },"took": 11,"timed_out": false
}

在此示例中,我想省略.hits.hits下的所有内容,或者将其替换为省略号(...)或直接忽略它。一个不错的选择是在示例中仅呈现id值。

pagingtooktimed_oud之类的字段是示例,可以更改,或者是一个相当长且冗长的列表,因此只需允许将所有应保留的内容列入清单(白名单)不是一种选择:我想过滤掉某个深度而不显示出来;不过,对某些被拒绝列出(列入黑名单)的项目进行过滤(例如删除所有.hits.hits.*)是可以的。

我尝试过jq '.' | cut -c1-40,这样就不需要进行水平滚动和/或换行,而无需进行较长的垂直滚动。

解决方法

我想从某个嵌套级别中删除所有项目

这是一个针对任何给定级别$ n进行此操作的函数:

def maxdepth($n):
  . as $in
  | reduce paths as $p (null;
       if ($p|length) > $n
       then .
       else ($in | getpath($p) ) as $v
       | if ($p|length) == $n
         then if (($v|type =="object") and ($v|length>1))
              then setpath($p; "{...}" )
              elif (($v|type == "array") and ($v|length>1))
              then setpath($p; "[...]" )
              else setpath($p; $v) 
              end
         else setpath($p; $v) 
         end
       end) ;

maxdepth(2)

使用您的示例,maxdepth(2)产生:

{
  "paging": {
    "next": "items?page=12","previous": "items?page=10"
  },"hits": {
    "total": 10200,"max_score": 1,"hits": "[...]"
  },"took": 11,"timed_out": false
}
,

使用以下程序将.hits.hits的所有成员更新为仅保留id字段,我想这就是您要查找的内容。

.hits.hits[] |= {id}

Online demo

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...