如何通过关键字访问json.loads加载字典的分支与子分支?
解决JSON分支的简洁访问问题
嘿,我来帮你搞定这个JSON分支访问的需求!先从简化你的代码开始,再给你写一个好用的递归函数,完全符合你要的“简洁方案”要求。
第一步:简化JSON加载代码
你之前写的PreProc函数其实有点多余,Python的json模块已经提供了直接加载文件的方法,不用手动读取文件内容再解析。咱们可以把加载代码改成这样:
import json path = 'C:\\path\\file.json' with open(path, 'r') as f: data = json.load(f)
with语句会自动帮你关闭文件,比手动调用close()更安全也更简洁。加载后的data就是嵌套的字典和列表结构,完全符合你的需求。
第二步:编写递归查找函数
你之前的递归函数报错,大概率是因为错误处理了dict.items()(它返回的是键值对元组,不是字典)。下面这个函数专门处理字典和列表的嵌套结构,能帮你找到任意关键字对应的分支:
def find_branch(data, target_key): # 处理字典类型:先检查当前字典是否有目标key if isinstance(data, dict): if target_key in data: return data[target_key] # 遍历所有值,递归查找子结构 for value in data.values(): result = find_branch(value, target_key) if result is not None: return result # 处理列表类型:遍历每个元素递归查找 elif isinstance(data, list): for item in data: result = find_branch(item, target_key) if result is not None: return result # 没找到目标key或者当前不是可遍历结构,返回None return None
第三步:测试使用
用你给出的JSON示例来测试,调用方式完全符合你的预期:
# 查找GlossList分支 gloss_list = find_branch(data, 'GlossList') print(gloss_list)
输出结果就是你要的GlossList对应的字典:
{'GlossEntry': {'ID': 'SGML', 'SortAs': 'SGML', 'GlossTerm': 'Standard Generalized Markup Language', 'Acronym': 'SGML', 'Abbrev': 'ISO 8879:1986', 'GlossDef': {'para': 'A meta-markup language, used to create markup languages such as DocBook.', 'GlossSeeAlso': ['GML', 'XML']}, 'GlossSee': 'markup'}}
如果要找更深的子分支,比如GlossSeeAlso,直接调用find_branch(data, 'GlossSeeAlso')就能得到['GML', 'XML']这个列表。
补充说明
- 这个函数会返回第一个匹配到目标key的分支内容,如果你的JSON里有多个相同的key,它会返回最先找到的那个。
- 不管嵌套多深的字典或列表,它都能自动递归查找,完全不用复杂的解码器或钩子。
- 如果找不到目标key,函数会返回
None,你可以根据需求改成抛出异常或者其他提示。
内容的提问来源于stack exchange,提问作者Oskars Sjomkāns
相关产品推荐
相关产品推荐

