You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
'

关键逻辑说明

  1. (.array3 // []):如果当前对象没有array3字段,就用空数组替代,统一后续处理逻辑。
  2. 数组长度判断:若数组有元素,就逐个展开生成对应条目;若为空数组(或原字段缺失),则直接生成一条带array3: null的条目。
  3. 移除了冗余的. |,简化命令结构。

内容的提问来源于stack exchange,提问作者bunkfish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:25:30