You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq统计嵌套JSON文档的叶子节点与空数组空对象数量

jq统计JSON叶子节点解决方案

1. 仅统计普通叶子节点(不含空对象/空数组,匹配期望输出6)

叶子节点定义为既不是对象也不是数组的基础值(布尔、数字、字符串、null),直接用jq内置的scalars筛选器即可实现:

echo '{"a": true, "b": [1, 2], "c": {"a": {"aa":1, "bb": 2}, "b": "blue"}}' \
| jq '[.. | scalars] | length'

执行后输出即为期望的6,原理如下:

  • .. 递归遍历JSON所有节点
  • scalars 筛选出所有非对象、非数组的基础值节点
  • 把符合条件的节点放入数组后求长度,即为统计结果

2. 包含空对象/空数组的统计方案

如果需要把空对象{}、空数组[]也作为叶子节点统计,调整筛选条件即可:

# 测试用JSON包含空数组和空对象
echo '{"a": true, "b": [], "c": {}, "d": {"aa": 1}}' \
| jq '[.. | select(scalars or (type == "object" and length == 0) or (type == "array" and length == 0))] | length'

上述示例的统计结果为4,分别对应true、[]、{}、1。

原代码输出异常原因

你原写法的逻辑是把遍历到的所有对象、数组的长度累加,额外统计了所有父级容器的长度:
根对象长度3、数组[1,2]长度2、c对应对象长度2、c.a对应对象长度2,累加和为9,加上初始值1后得到10,和实际输出一致,问题出在没有过滤掉父级容器节点,直接累加了容器长度。

内容的提问来源于stack exchange,提问作者Jeremy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:02