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

如何用jq将第二个JSON匹配值填充到第一个JSON(保留原结构)

解决方案:保留JSON结构并替换存在的值

输入JSON

结构模板JSON(source.json)

{
    "A": {
        "A1": {
            "A11": null,
            "A12": null
        }
    },
    "B": {
        "B1": {
            "B12": null
        },
        "B2": null
    },
    "C": {
        "C1": {
            "C11": null,
            "C12": null
        },
        "C2" : {
            "C21": {
                "C211": null
            }
        }
    }
}

值替换JSON(override.json)

{
    "A": {
        "A1": {
            "A11": "valueA11"
        }
    },
    "B": {
        "B1": {
            "B12": "valueB12",
            "B13": "valueB13"
        },
        "B2": "valueB2"
    },
    "C": "valueC"
}

jq实现命令

使用jq的递归合并逻辑,严格保留模板JSON的结构,仅替换存在的键值:

jq --argfile src source.json --argfile override override.json '
def merge($o):
    if type == "object" then
        reduce keys[] as $k (.;
            .[$k] = if $o[$k] != null then .[$k] | merge($o[$k]) else .[$k] end
        )
    else
        $o // .
    end;
$src | merge($override)
'

逻辑说明

  • 定义递归函数merge:
    1. 若当前节点是对象,遍历所有模板中的键:
      • 如果替换JSON中存在该键且不为null,就递归处理该键对应的子结构
      • 否则保留模板中的原值(null)
    2. 若当前节点不是对象(比如模板中是null,替换JSON是字符串),则优先使用替换JSON的值,否则保留原模板值
  • 特殊处理:当模板中是对象、替换JSON中是普通值时(比如示例中的C键),因为模板节点是对象,会进入对象处理逻辑,替换JSON中没有对应对象结构的子键,因此保留模板的对象结构,不会被替换成字符串

输出结果

{
    "A": {
        "A1": {
            "A11": "valueA11",
            "A12": null
        }
    },
    "B": {
        "B1": {
            "B12": "valueB12"
        },
        "B2": "valueB2"
    },
    "C": {
        "C1": {
            "C11": null,
            "C12": null
        },
        "C2": {
            "C21": {
                "C211": null
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:23:18