You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过关键字访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:08:49