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

如何用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": ""
                    }
                ]
            }
        }
    ]
}

问题分析

  1. schema配置不足:原schema只给最外层的tree数组设置了append策略,没有定义嵌套层级(比如Bud下的Flower数组)的合并规则,导致jsonmerge无法识别需要合并数组内的对象属性。
  2. 数组策略错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:05:58