Json 如何使用jq删除或忽略某些嵌套级别的值
我有一个嵌套很深的JSON,它太大了,看不透;我想从某个嵌套级别删除所有项目,最好使用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, "
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手册中的“定义函数”部分,例如。