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

Python递归添加字典required数组元素时出现缺失问题求助

问题

我有一个需要解析为JSON格式的字典,结构如下:

{'transportation': {'airplane': {'properties': {'fly': {'type': 'string'}, 'pilot': {'type': 'string'}}}, 'car': {'properties': {'drive': {'type': 'string'}, 'driver': {'type': 'string'}}}, 'boat': {'properties': {'sail': {'type': 'string'}, 'sailer': {'type': 'string'}}}}}

我想要给该字典的指定节点添加包含元素数组的required字段,因此编写了一个递归函数来遍历对象并在正确层级插入值,代码如下:

dataReqProp = (
    ['airplane', 'fly'],
    ['boat', 'sail'],
    ['car', 'driver'],
    ['boat', 'sailer']
)

obj = {'transportation': {'airplane': {'properties': {'fly': {'type': 'string'}, 'pilot': {'type': 'string'}}}, 'car': {'properties': {'drive': {'type': 'string'}, 'driver': {'type': 'string'}}}, 'boat': {'properties': {'sail': {'type': 'string'}, 'sailer': {'type': 'string'}}}}}

def update_required_json(obj, target_key, update_value):
    if isinstance(obj, dict):
        for key, value in obj.items():
            if key == target_key:
                obj[key].update({'required': update_value})
            update_required_json(value, target_key, update_value)

    elif isinstance(obj, list):
        for entity in obj:
            update_required_json(entity, target_key, update_value)


for key, prop in dataReqProp:
    new_prop = [prop]
    update_required_json(obj, key, new_prop)
    

print(obj)

但执行后发现required字段仅保留了最后一个元素,比如boat节点的required数组应该包含sail和sailer,但实际只保留了sailer,输出如下:

{'transportation': {'airplane': {'properties': {'fly': {'type': 'string'}, 'pilot': {'type': 'string'}}, 'required': [['fly']]}, 'car': {'properties': {'drive': {'type': 'string'}, 'driver': {'type': 'string'}}, 'required': [['driver']]}, 'boat': {'properties': {'sail': {'type': 'string'}, 'sailer': {'type': 'string'}}, 'required': ['sailer']}}}

请问我忽略了什么问题?


问题分析与解决

核心问题

  • 覆盖而非追加:每次调用update_required_json时,你用obj[key].update({'required': update_value})直接覆盖了已有的required字段,没有做追加操作。比如处理boat的sail时添加了['sail'],后续处理sailer时直接替换成了['sailer'],之前的值被完全覆盖。
  • 数组嵌套错误:你传入的update_value是[prop](数组嵌套数组),导致airplane的required变成了[['fly']],但实际需要的是将prop作为元素添加到一维数组中。
  • 递归逻辑的目标偏差:你的函数是全局查找所有匹配target_key的节点,但实际需求是定位到父节点(如boat)后,给该节点的required数组添加子属性名,而非替换整个字段。

修正后的代码

调整逻辑为先定位父节点,再检查并追加元素到required数组:

dataReqProp = (
    ['airplane', 'fly'],
    ['boat', 'sail'],
    ['car', 'driver'],
    ['boat', 'sailer']
)

obj = {'transportation': {'airplane': {'properties': {'fly': {'type': 'string'}, 'pilot': {'type': 'string'}}}, 'car': {'properties': {'drive': {'type': 'string'}, 'driver': {'type': 'string'}}}, 'boat': {'properties': {'sail': {'type': 'string'}, 'sailer': {'type': 'string'}}}}}

def update_required_json(obj, parent_key, prop_name):
    if isinstance(obj, dict):
        for key, value in obj.items():
            if key == parent_key:
                # 初始化required数组(不存在则创建)
                if 'required' not in value:
                    value['required'] = []
                # 避免重复添加相同属性
                if prop_name not in value['required']:
                    value['required'].append(prop_name)
            update_required_json(value, parent_key, prop_name)
    elif isinstance(obj, list):
        for entity in obj:
            update_required_json(entity, parent_key, prop_name)

for parent_key, prop_name in dataReqProp:
    update_required_json(obj, parent_key, prop_name)

print(obj)

正确执行结果

修正后输出的字典中,各节点的required字段会正确包含所有指定属性:

{'transportation': {'airplane': {'properties': {'fly': {'type': 'string'}, 'pilot': {'type': 'string'}}, 'required': ['fly']}, 'car': {'properties': {'drive': {'type': 'string'}, 'driver': {'type': 'string'}}, 'required': ['driver']}, 'boat': {'properties': {'sail': {'type': 'string'}, 'sailer': {'type': 'string'}}, 'required': ['sail', 'sailer']}}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:20:40