如何用jsonmerge向数组所有对象新增属性?合并异常求助
用jsonmerge同步JSON数组内对象的新增属性问题解决
问题场景
我有一个主JSON模板供用户导出填写,用户可以在任意数组中添加/修改对象。现在主模板更新,给Flower数组内的所有对象新增了xtra属性,需要将这个新属性同步到用户已有的所有Flower对象中。但使用jsonmerge库时,无论尝试哪种合并策略,结果都是将两个tree数组的元素直接追加在一起,并没有给用户数据里的Flower对象添加上新属性。
原代码及错误结果
import json from jsonmerge import Merger schema = { "properties":{ "tree":{ "type":"array", "mergeStrategy": "append" } }, "additionalProperties":False } mstr = { "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "", "Colour": "", "xtra":"" } ] } } ] } data = { "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "green", "Colour": "" }, { "Size": "red", "Colour": "" } ] } } ] } merger = Merger(schema) result = merger.merge(data,mstr) print(result)
错误结果:
{ "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "", "Colour": "", "xtra": "" } ] } }, { "Name": "", "Bud": { "Flower": [ { "Size": "green", "Colour": "" }, { "Size": "red", "Colour": "" } ] } } ] }
问题分析
- schema配置不足:原schema只给最外层的
tree数组设置了append策略,没有定义嵌套层级(比如Bud下的Flower数组)的合并规则,导致jsonmerge无法识别需要合并数组内的对象属性。 - 数组策略错误:
append策略会直接将两个数组的元素追加,而不是合并数组内对应的对象。
解决方案
修改schema,明确嵌套结构的合并策略,让jsonmerge能够递归合并数组内的对象,自动添加新属性:
import json from jsonmerge import Merger # 定义完整的嵌套合并策略 schema = { "properties": { "tree": { "type": "array", "mergeStrategy": "merge", # 合并数组内的对应元素,而非追加 "items": { "type": "object", "properties": { "Bud": { "type": "object", "properties": { "Flower": { "type": "array", "mergeStrategy": "merge", # 合并Flower数组内的每个对象 "items": { "type": "object", "mergeStrategy": "merge" # 对象级合并,自动添加新属性 } } } } } } } }, "additionalProperties": False } mstr = { "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "", "Colour": "", "xtra":"" } ] } } ] } data = { "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "green", "Colour": "" }, { "Size": "red", "Colour": "" } ] } } ] } merger = Merger(schema) result = merger.merge(data, mstr) print(json.dumps(result, indent=2))
正确结果
{ "tree": [ { "Name": "", "Bud": { "Flower": [ { "Size": "green", "Colour": "", "xtra": "" }, { "Size": "red", "Colour": "", "xtra": "" } ] } } ] }
关键说明
mergeStrategy: "merge"用于数组时,会将两个数组的对应索引元素进行合并;用于对象时,会将新对象的属性合并到原对象中,自动补充缺失的属性。- 必须在schema中逐层定义嵌套结构的合并规则,确保jsonmerge能递归处理到最内层的
Flower对象。
内容的提问来源于stack exchange,提问作者SiBush
相关产品推荐
相关产品推荐

