Python递归解析JSON无法定位目标键'five'问题排查
递归解析JSON无法定位'five'键的问题排查
测试用JSON结构:
{ "one": "one", "two": { "three": "three", "four": [{ "five": { "six": "six" } }] } }
原Python代码:
json_file_path = r"\\filepathto\\testing.json" j = json.load(open(json_file_path, 'r', 'utf-8-sig')) def dict_opener(j): if isinstance(j, dict): for key, value in j.items(): if isinstance(value, list): list_opener(j) if isinstance(value, dict) and key == "five": print("found") elif isinstance(value, dict): dict_opener(value) def list_opener(j): for i in j: if isinstance(i, list): list_opener(i) elif isinstance(i, dict): dict_opener(i) dict_opener(j)
问题原因分析
- 列表处理传参错误:在
dict_opener中,判断value是列表时,调用list_opener(j)传递的是当前字典j而非实际的列表value。list_opener遍历字典的字符串键,完全碰不到嵌套在列表里的目标字典,导致five永远不会被解析到。 - 目标键判断逻辑有局限:原代码仅在
value是字典时才判断键是否为five,但即使传参正确,列表内的字典需要先被list_opener传递给dict_opener才能触发判断,而传参错误直接阻断了这个流程。
修正后的代码
json_file_path = r"\\filepathto\\testing.json" j = json.load(open(json_file_path, 'r', 'utf-8-sig')) def dict_opener(obj): if isinstance(obj, dict): for key, value in obj.items(): if isinstance(value, list): list_opener(value) # 修正:传递实际的列表对象 elif isinstance(value, dict): dict_opener(value) # 直接判断当前键是否为目标,无需绑定value类型 if key == "five": print("找到five,内容为:", value) def list_opener(obj): for item in obj: if isinstance(item, list): list_opener(item) elif isinstance(item, dict): dict_opener(item) dict_opener(j)
修正说明
- 修复
list_opener的传参问题,确保列表内的元素能被正确遍历解析。 - 调整
key == "five"的判断位置,只要遍历到目标键就触发,同时直接输出five对应的完整内容,满足需求。
内容的提问来源于stack exchange,提问作者tlars25
相关产品推荐
相关产品推荐

