Python如何向函数传递JSON对象实现多层嵌套字段安全取值
报错原因
- 你写的传参
["DataChangedEntry"]["CurrentValue"]["RefId"]["Value"]本身就是非法写法:这行代码会先生成一个只有"DataChangedEntry"一个元素的列表,紧接着用字符串"CurrentValue"去索引列表。Python列表仅支持整数、切片作为索引,所以会直接抛出你看到的TypeError,这个错误发生在函数调用阶段,根本没有进入你定义的函数逻辑。 - 你写的
my_function仅支持取单层key的值,没有逐层遍历嵌套路径的逻辑,本身也无法满足多层嵌套JSON的取值需求。
正确实现方式
传参规则
把嵌套结构从最外层到目标字段的所有key,按顺序放在同一个列表里作为路径参数传入,比如示例中目标字段的路径参数应为["DataChangedEntry", "CurrentValue", "RefId", "Value"]。
函数代码
遍历路径列表逐层深入取值,过程中捕获嵌套取值的常见异常,路径不存在时返回预设默认值即可,不要用裸except避免吞掉程序本身的其他错误:
import logging def get_nested_value(json_obj, key_path, default=None): current_node = json_obj try: for key in key_path: current_node = current_node[key] return current_node except (KeyError, TypeError, IndexError): logging.exception("嵌套字段取值失败,路径:%s", key_path) return default
调用示例
# 测试用JSON结构 my_json = { "DataChangedEntry": { "CurrentValue": { "RefId": { "Value": "aaaaaaa" } } } } # 正常取值 target_value = get_nested_value(my_json, ["DataChangedEntry", "CurrentValue", "RefId", "Value"]) print(target_value) # 输出: aaaaaaa # 路径错误时不会中断程序,返回默认值None error_test = get_nested_value(my_json, ["DataChangedEntry", "NotExistKey", "RefId"]) print(error_test) # 输出: None
捕获的三类异常对应常见取值错误场景:
KeyError为字典key不存在;TypeError为当前节点不是支持key/索引取值的字典/列表类型(比如遍历到数字、字符串值还尝试往下取子节点);IndexError为列表类型节点的索引超出范围,覆盖了绝大多数嵌套结构取值的异常情况。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

