如何在JQ中正确输出含可选数组的指定JSON格式内容
问题:JQ命令处理嵌套JSON时丢失空数组/缺失字段的条目
示例输入JSON
{ "field1": "test1", "array1": [ { "field2": "test20", "array2": [ { "field3": "test30", "array3": [ "11","12" ] } ] }, { "field2": "test21", "array2": [ { "field3": "test31", "array3": [ ] } ] }, { "field2": "test22", "array2": [ { "field3": "test32" } ] } ] }
期望输出
{"field1":"test1","field2":"test20","field3":"test30","array3":"11"} {"field1":"test1","field2":"test20","field3":"test30","array3":"12"} {"field1":"test1","field2":"test21","field3":"test31","array3":null} {"field1":"test1","field2":"test22","field3":"test32","array3":null}
原命令问题
原命令:
jq --compact-output '.field1 as $field1 | .array1[] | . | .field2 as $field2 | . | .array2[] | . | .field3 as $field3 | try ({$field1, $field2, $field3, array3: .array3[]}) catch ({$field1, $field2, $field3, array3: null})'
该命令仅输出3条结果,丢失了field2: test22对应的条目。核心原因是:当.array3不存在或为空数组时,.array3[]会直接终止当前遍历分支,try/catch无法覆盖这种场景——空数组展开时根本不会进入try块,直接跳过了整个条目。
解决方案
先统一处理缺失的array3字段,再根据数组长度决定是展开元素还是输出null,修正后的命令:
jq --compact-output ' .field1 as $field1 | .array1[] | .field2 as $field2 | .array2[] | .field3 as $field3 | (.array3 // []) as $arr3 | if $arr3 | length > 0 then $arr3[] | {$field1, $field2, $field3, array3: .} else {$field1, $field2, $field3, array3: null} end '
关键逻辑说明
(.array3 // []):如果当前对象没有array3字段,就用空数组替代,统一后续处理逻辑。- 数组长度判断:若数组有元素,就逐个展开生成对应条目;若为空数组(或原字段缺失),则直接生成一条带
array3: null的条目。 - 移除了冗余的
. |,简化命令结构。
内容的提问来源于stack exchange,提问作者bunkfish
相关产品推荐
相关产品推荐

