Python跨函数传递JSON字典内路径触发KeyError如何解决
报错原因
你传入的"['first']['second']"是一个完整字符串,函数内部会把这个字符串当作单个字典键去查询JSON对象,而你的JSON里根本不存在名为"['first']['second']"的键,自然触发KeyError。你直接写ReadedJSONObjects['first']['second']时Python解释器会自动解析成两次层级取值,先取'first'对应的字典,再取'second'对应的列表,和把整串当单个键的逻辑完全不一样。
推荐解决方案
优先用**键序列(列表/元组)**传递路径,这是最安全、性能最高的方案,不需要做额外的字符串解析:
- 传递路径时,把多层键按顺序放到列表里,比如目标路径是
['first']['second'],就传参数['first', 'second'] - 函数内部遍历键序列逐层取值即可,示例实现如下:
def replaceJSONFilesList(json_obj, key_path, append_items): current = json_obj # 逐层遍历到目标列表的父层级 for key in key_path[:-1]: current = current[key] # 拿到目标列表执行追加 target_list = current[key_path[-1]] target_list.extend(append_items) # 后续写回文件的逻辑保持不变即可 # modifyJSONFile 内调用示例 replaceJSONFilesList(ReadedJSONObjects, ['first', 'second'], [要追加的内容])
兼容字符串格式路径的方案
如果一定要保留"['first']['second']"这种字符串格式的路径写法,可以用ast.literal_eval安全解析字符串为键序列,不要用eval避免执行恶意代码:
import ast def parse_path_string(path_str): # 拼接成虚拟的字典取值表达式,解析后得到所有键的元组 return ast.literal_eval(f'_dummy{path_str}') # 调用前先解析路径 key_path = parse_path_string("['first']['second']") replaceJSONFilesList(ReadedJSONObjects, key_path, [要追加的内容])
内容的提问来源于stack exchange,提问作者mshta
相关产品推荐
相关产品推荐

