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

Json 如何使用jq删除或忽略某些嵌套级别的值,json,nested,jq,ellipsis,Json,Nested,Jq,Ellipsis,我有一个嵌套很深的JSON,它太大了,看不透;我想从某个嵌套级别删除所有项目,最好使用jq 比如,JSON是: { "paging": { "next": "items?page=12", "previous": "items?page=10" }, "hits": { "total": 10200, "

我有一个嵌套很深的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

paging
take
、和
timed\u oud
这样的字段都是示例,它们可能会改变,或者是一个相当长且有用的列表,因此简单地允许列出(白名单)所有应该保留的内容不是一个选项:我想过滤掉某个深度,而不是显示它;不过,对某些未列出(黑名单)的项目进行过滤,如删除所有
.hits.hits.*
是可以的


我尝试过
jq.”剪切-c1-40,这样就不需要水平滚动和/或包装,但不需要长时间的垂直滚动。

更新
的所有成员。hits.hits
使用下面的程序只留下
id
字段,我想这就是你要找的

.hits.hits[] |= {id}

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

这里有一个函数,它可以对任何给定的级别执行此操作,$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) ;
最大深度(2) 使用您的示例,
maxdepth(2)
生成:

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

我不知道jq可以处理脚本和函数。您是否可以添加关于如何在
jq
中使用此函数的说明,或者必须在jq之外使用(perl?)解释器运行此函数?请参阅jq手册中的“定义函数”部分,例如。