
在处理从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值。分析其结构,我们可以看到:
访问嵌套数据时,核心原则是根据当前层的数据类型选择正确的访问方式:
在上述JSON示例中,尝试直接通过play['runners']['details']访问会导致错误,因为play['runners']是一个列表,而不是字典,它不能直接通过字符串键'details'访问。正确的做法是先通过索引访问列表中的元素,然后对该元素(通常是一个字典)使用键进行访问。
立即学习“Python免费学习笔记(深入)”;
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
假设我们想获取第一个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}")
注意事项:
高效访问Python中嵌套的JSON/字典列表数据,关键在于精确理解数据的结构。当遇到列表时,使用整数索引;当遇到字典时,使用字符串键。对于生产环境的代码,务必考虑数据可能缺失的情况,并使用try-except块或dict.get()方法来增强代码的健壮性,确保程序在面对不规则数据时不会崩溃。通过迭代和条件检查,可以灵活地提取所有符合条件的数据,而不仅仅是第一个匹配项。
以上就是Python中高效访问嵌套JSON/字典列表数据教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号