如何用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:- 若当前节点是对象,遍历所有模板中的键:
- 如果替换JSON中存在该键且不为null,就递归处理该键对应的子结构
- 否则保留模板中的原值(null)
- 若当前节点不是对象(比如模板中是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
相关产品推荐
相关产品推荐

