如何使用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
相关产品推荐
相关产品推荐

