jq嵌套select正确用法:解决查询JSON数组元素的迭代null错误
解决方案
错误原因
你遇到的cannot iterate over null错误,是因为遍历过程中遇到了null值(比如某个项的.changelog或.fields为null/不存在),直接用[]遍历会触发报错,需要用可选链式调用或空数组兜底来处理这种情况。
针对需求的JQ代码
根据你描述的需求(筛选顶层数组中,其.fields数组包含满足.field.id=="status"且.to.id=="closed"元素的项),结合可能的null情况,推荐两种写法:
写法1:用any函数高效判断存在性(推荐)
any函数可直接判断是否存在满足条件的元素,无需遍历全部,更高效:
.[] | select( any(.fields[]?; .field?.id == "status" and .to?.id == "closed" ) )
写法2:适配含.changelog的结构(参考你的错误代码)
如果你的实际数据结构是顶层项包含.changelog数组,则调整为:
.[] | select( any(.changelog[]?.fields[]?; .field.id == "status" and .to.id == "closed" ) )
关键语法说明
?.:可选链式调用,当左侧值为null或不存在时,返回null而非报错,安全跳过无效项any(遍历表达式; 判断条件):只要遍历表达式中有任意一个元素满足条件,就返回true.[]:遍历数组中的每个元素
非标准JSON预处理
你提供的示例JSON是非标准格式(key未加双引号、字符串用单引号),jq默认无法解析,需要先转换为标准JSON:
jq -R 'gsub("\'\'"; "\"") | gsub("([a-zA-Z0-9_]+):"; "\"\1\":") | fromjson' your-file.txt
内容的提问来源于stack exchange,提问作者V1st
相关产品推荐
相关产品推荐

