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
相关产品推荐
相关产品推荐

