如何用jq统计嵌套JSON中type为null或数组含null的对象数量
统计JSON中符合type规则的对象总数(jq实现)
需求说明
需要递归统计任意深度嵌套JSON中,满足以下任一条件的对象总数量:
- 对象的
type属性值为字符串"null" - 对象的
type属性值为数组,且数组内包含"null"元素
给定示例JSON中符合条件的对象共2个,示例内容如下:
{ "A": { "type": "string" }, "B": { "type": "null" }, "C": { "type": [ "null", "string" ] } }
原有命令jq '[..|select(.type?=="null")] | length'仅能匹配type直接为字符串"null"的场景,无法识别type为数组且包含"null"的情况,无法返回正确结果。
可行命令
逻辑直观版
jq ' [ .. | select( .type? == "null" or (.type? | type == "array" and index("null") != null) ) ] | length '
逻辑说明
..:递归遍历JSON所有层级的节点,支持深层嵌套结构.type?:安全读取当前节点的type属性,节点无type属性时直接跳过,不会抛出错误- 第一个判断分支:匹配
type值直接为字符串"null"的对象 - 第二个判断分支:先校验
type值是否为数组,再检查数组中是否存在"null"元素 - 所有符合条件的节点会被收集到数组中,最终通过
length输出数组长度即符合条件的对象总数
在给定示例JSON上执行上述命令,会正确返回结果2。
简洁写法
也可以通过统一把type值打平为一维数组再判断的方式简化写法,效果完全一致:
jq '[.. | select(.type? as $t | [$t] | flatten | index("null") != null)] | length'
内容的提问来源于stack exchange,提问作者SCM
相关产品推荐
相关产品推荐

