Python中高效访问嵌套JSON/字典列表数据教程

碧海醫心
发布: 2025-08-15 23:26:20
原创
243人浏览过

Python中高效访问嵌套JSON/字典列表数据教程

本教程详细讲解如何在Python中访问深层嵌套的JSON或字典列表数据。通过分析数据结构,本教程将展示如何正确结合使用列表索引和字典键来精确提取所需信息,并提供迭代、错误处理及最佳实践,帮助开发者避免常见的KeyError或IndexError,从而高效、稳健地处理复杂数据。

理解嵌套数据结构

在处理从api响应或文件读取的json数据时,我们经常会遇到多层嵌套的字典(dictionary)和列表(list)结构。json数据在python中通常被解析为字典和列表的组合。理解数据的层次结构是成功访问其内部值的关键。

考虑以下来自Major League Baseball的JSON数据片段:

{
  "liveData": {
    "plays": {
      "allPlays": [
        {
          "runners": [
            {
              "details": {
                "event": "Single",
                "runner": {
                  "id": 656941,
                  "fullName": "Kyle Schwarber"
                },
                "responsiblePitcher": null,
                "isScoringEvent": false,
                "rbi": false,
                "earned": false,
                "teamUnearned": false,
                "playIndex": 6
              }
            }
          ]
        },
        {
          "runners": [
            {
              "details": {
                "event": "Walk",
                "runner": {
                  "id": 123456,
                  "fullName": "Another Player"
                },
                "responsiblePitcher": null,
                "isScoringEvent": false,
                "rbi": false,
                "earned": false,
                "teamUnearned": false,
                "playIndex": 7
              }
            }
          ]
        }
      ]
    }
  }
}
登录后复制

我们的目标是从这个结构中提取runner的id值。分析其结构,我们可以看到:

  • 根是字典。
  • liveData是一个字典。
  • plays是一个字典。
  • allPlays是一个列表,其中包含多个“play”字典。
  • 每个“play”字典中,runners是一个列表,其中包含多个“runner entry”字典。
  • 每个“runner entry”字典中,details是一个字典。
  • details字典中,runner是一个字典。
  • 最终,runner字典中包含我们需要的id键。

正确的访问策略

访问嵌套数据时,核心原则是根据当前层的数据类型选择正确的访问方式:

  • 字典(dict): 使用键(字符串)进行访问,例如 my_dict['key']。
  • 列表(list): 使用索引(整数)进行访问,例如 my_list[0]。

在上述JSON示例中,尝试直接通过play['runners']['details']访问会导致错误,因为play['runners']是一个列表,而不是字典,它不能直接通过字符串键'details'访问。正确的做法是先通过索引访问列表中的元素,然后对该元素(通常是一个字典)使用键进行访问。

立即学习Python免费学习笔记(深入)”;

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

示例代码:直接访问

假设我们想获取第一个allPlays条目中第一个runners条目的id值:

import json

json_data_str = """
{
  "liveData": {
    "plays": {
      "allPlays": [
        {
          "runners": [
            {
              "details": {
                "event": "Single",
                "runner": {
                  "id": 656941,
                  "fullName": "Kyle Schwarber"
                },
                "responsiblePitcher": null,
                "isScoringEvent": false,
                "rbi": false,
                "earned": false,
                "teamUnearned": false,
                "playIndex": 6
              }
            }
          ]
        },
        {
          "runners": [
            {
              "details": {
                "event": "Walk",
                "runner": {
                  "id": 123456,
                  "fullName": "Another Player"
                },
                "responsiblePitcher": null,
                "isScoringEvent": false,
                "rbi": false,
                "earned": false,
                "teamUnearned": false,
                "playIndex": 7
              }
            }
          ]
        }
      ]
    }
  }
}
"""

# 将JSON字符串加载为Python字典
data = json.loads(json_data_str)

# 逐层访问目标ID
# 1. data["liveData"] 访问根字典中的 'liveData' 键
# 2. ["plays"] 访问 'liveData' 字典中的 'plays' 键
# 3. ["allPlays"] 访问 'plays' 字典中的 'allPlays' 键 (这是一个列表)
# 4. [0] 访问 'allPlays' 列表的第一个元素 (这是一个字典)
# 5. ["runners"] 访问该字典中的 'runners' 键 (这是一个列表)
# 6. [0] 访问 'runners' 列表的第一个元素 (这是一个字典)
# 7. ["details"] 访问该字典中的 'details' 键 (这是一个字典)
# 8. ["runner"] 访问 'details' 字典中的 'runner' 键 (这是一个字典)
# 9. ["id"] 访问 'runner' 字典中的 'id' 键 (最终值)
try:
    id_value = data["liveData"]["plays"]["allPlays"][0]["runners"][0]["details"]["runner"]["id"]
    print(f"提取到的ID值: {id_value}")
except (KeyError, IndexError) as e:
    print(f"访问路径出错: {e}")
登录后复制

迭代与更健壮的访问

在实际应用中,列表通常包含多个元素,我们可能需要遍历所有元素来提取信息,而不是仅仅依赖于第一个元素[0]。此外,数据结构可能不总是完整的,某些键或索引可能不存在。因此,添加错误处理和迭代逻辑至关重要。

import json

# 假设 data 变量已如上所示加载
# data = json.loads(json_data_str)

all_extracted_ids = []

if 'liveData' in data and \
   'plays' in data['liveData'] and \
   'allPlays' in data['liveData']['plays']:

    # 遍历 allPlays 列表中的每一个 play
    for play in data['liveData']['plays']['allPlays']:
        # 检查 'runners' 键是否存在且其值不为空列表
        if 'runners' in play and play['runners']:
            # 遍历 runners 列表中的每一个 runner_entry
            for runner_entry in play['runners']:
                # 使用 .get() 方法安全地访问字典,避免 KeyError
                details = runner_entry.get('details')
                if details:
                    runner_info = details.get('runner')
                    if runner_info:
                        player_id = runner_info.get('id')
                        if player_id is not None: # 确保 ID 存在且非 None
                            all_extracted_ids.append(player_id)
else:
    print("JSON结构不符合预期,缺少核心键。")

print(f"所有提取到的ID值: {all_extracted_ids}")
登录后复制

注意事项:

  • dict.get() 方法: 使用dictionary.get('key', default_value)比直接dictionary['key']更安全。如果键不存在,get()会返回default_value(默认为None),而不是抛出KeyError。这使得代码在面对不完整或不一致的数据时更健壮。
  • json_normalize: 问题中提到了json_normalize。pandas.json_normalize函数主要用于将半结构化的JSON数据扁平化为DataFrame。它对于处理层级不深且结构相对统一的列表字典非常有效。然而,对于像本例中这种深层嵌套且内部列表包含复杂字典的情况,json_normalize可能需要配合record_path和meta参数进行多次调用,或者无法直接满足所有深层数据的提取需求,尤其是在需要遍历内部列表时。对于精确到某个特定深层值的提取,手动逐层访问或结合迭代通常更直接和灵活。

总结

高效访问Python中嵌套的JSON/字典列表数据,关键在于精确理解数据的结构。当遇到列表时,使用整数索引;当遇到字典时,使用字符串键。对于生产环境的代码,务必考虑数据可能缺失的情况,并使用try-except块或dict.get()方法来增强代码的健壮性,确保程序在面对不规则数据时不会崩溃。通过迭代和条件检查,可以灵活地提取所有符合条件的数据,而不仅仅是第一个匹配项。

以上就是Python中高效访问嵌套JSON/字典列表数据教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号