如何在不加载JSON到内存且不重编译jq时确定其最大嵌套深度?
无需重编译jq时,命令行确定JSON嵌套深度
如果JSON文档能正常加载到内存(嵌套深度未触发jq的256上限),直接用路径遍历计算最大深度:
- 执行命令:
jq 'paths | length | max' input.json- 逻辑:
paths生成所有叶子节点的路径数组,length计算每个路径的嵌套层级数,max取所有层级数的最大值。
- 逻辑:
若文档嵌套深度超过256,直接执行上述命令会触发深度报错,此时用--stream模式绕过限制:
- 执行命令:
jq --stream 'select(length == 2) | .[0] | length' input.json | sort -nr | head -n1- 逻辑:
--stream将JSON拆分为[路径数组, 节点值]的流式数据,select(length == 2)筛选出带值的节点,提取路径数组后计算其长度(即嵌套深度),最后通过排序取最大值。
- 逻辑:
JSON无法加载到内存时,用jq确定最大深度
这种场景必须依赖--stream模式,它不需要加载整个文档到内存,而是逐块处理数据:
纯jq实现命令:
jq --stream -n 'reduce inputs as $in (0; if $in | length == 2 then ($in[0] | length) as $d | if $d > . then $d else . end else . end)' input.json- 逻辑:
-n配合inputs读取流式数据,reduce遍历所有输入并维护当前最大深度变量,遇到带值节点时计算其深度并更新最大值,最终输出最大嵌套深度。
- 逻辑:
结合awk简化的命令:
jq --stream 'select(length == 2) | .[0] | length' input.json | awk '{if ($1 > max) max=$1} END {print max}'- 逻辑:用jq提取所有节点的深度值,再通过awk遍历记录最大值并输出。
内容的提问来源于stack exchange,提问作者peak
相关产品推荐
相关产品推荐

