JQ报错Cannot iterate over null:动态JSON字段映射问题排查
解决JQ字段映射时的"Cannot iterate over null"错误
报错原因
你的JQ脚本报错是因为inputArray中存在null元素,或者在按schema映射字段时,试图访问null对象的属性。即便schema本身存在,数组里的null项会打断遍历流程;直接给数组加?会导致整个数组被当成可选值,一旦遇到null就直接返回空,而非处理有效数据。
解决方案
分两步处理,既过滤无效的null元素,又安全处理字段映射:
过滤数组内的null元素
先用map(select(. != null))剔除inputArray中的null项,确保后续遍历的都是有效对象。安全映射字段
将schema转为键值对数组后遍历,用//为缺失的原字段设置默认值(比如null),避免访问null属性报错。
示例代码
假设你的输入JSON(/tmp/data.json)结构如下:
{ "inputArray": [ {"oldField1": "val1", "oldField2": "val2"}, null, {"oldField1": "val3"} ], "schema": { "newFieldA": "oldField1", "newFieldB": "oldField2" } }
修正后的JQ执行命令:
jq --argjson schema "$(jq '.schema' /tmp/data.json)" ' .inputArray | map(select(. != null)) | map( reduce ($schema | to_entries[]) as {$key, $value}; ({}; .[$key] = .[$value] // null) ) ' /tmp/data.json
执行结果
[ { "newFieldA": "val1", "newFieldB": "val2" }, { "newFieldA": "val3", "newFieldB": null } ]
如果你的schema是内嵌在输入JSON里的,也可以简化脚本:
.inputArray | map(select(. != null)) | map( reduce (.schema | to_entries[]) as {$key, $value}; ({}; .[$key] = .[$value] // null) )
内容的提问来源于stack exchange,提问作者tmcc
相关产品推荐
相关产品推荐

