遍历 Python 中的嵌套 JSON
Iterate through nested JSON in Python
js = {
"status": "ok",
"meta": {
"count": 1
},
"data": {
"542250529": [
{
"all": {
"spotted": 438,
"battles_on_stunning_vehicles": 0,
"avg_damage_blocked": 39.4,
"capture_points": 40,
"explosion_hits": 0,
"piercings": 3519,
"xp": 376586,
"survived_battles": 136,
"dropped_capture_points": 382,
"damage_dealt": 783555,
"hits_percents": 74,
"draws": 2,
"battles": 290,
"damage_received": 330011,
"frags": 584,
"stun_number": 0,
"direct_hits_received": 1164,
"stun_assisted_damage": 0,
"hits": 4320,
"battle_avg_xp": 1299,
"wins": 202,
"losses": 86,
"piercings_received": 1004,
"no_damage_direct_hits_received": 103,
"shots": 5857,
"explosion_hits_received": 135,
"tanking_factor": 0.04
}
}
]
}
}
让我们将这个json“js”命名为一个变量,这个变量将在一个for循环中。
为了更好地理解我在这里做什么,我正在尝试从游戏中收集数据。
这个游戏有数百个不同的坦克,每个坦克都有 tank_id,我可以用它 post tank_id 到游戏服务器并将性能数据响应为“js”。
for tank_id: json = requests.post(tank_id) etc...
并将所有这些值提取到我的数据库中,如屏幕截图所示。
我的 python 代码:
def api_get():
for property in js['data']['542250529']['all']:
spotted = property['spotted']
battles_on_stunning_vehicles = property['battles_on_stunning_vehicles']
# etc
# ...
insert_to_db(spotted, battles_on_stunning_vehicles, etc....)
例外情况是:
for property in js['data']['542250529']['all']:
TypeError: list indices must be integers or slices, not str
以及何时:
print(js['data']['542250529'])
我将 js 的其余部分作为字符串获取,我无法迭代...不能使用有效的 json 字符串,以及 js 中的内容['data'] ['542250529'] 是一个仅包含项目 'all'... 的列表,我们将不胜感激
您刚刚 [0]
未能获得列表中的第一项:
def api_get():
for property in js['data']['542250529'][0]['all']:
spotted = property['spotted']
# ...
仔细看源码中的数据结构JSON.
有一个包含关键字为 all
的字典的列表。所以你需要使用 js['data']['542250529'][0]['all']
而不是 js['data']['542250529']['all']
。然后你可以使用 .items()
来获取键值对。
见下文。
js = {
"status": "ok",
"meta": {
"count": 1
},
"data": {
"542250529": [
{
"all": {
"spotted": 438,
"battles_on_stunning_vehicles": 0,
"avg_damage_blocked": 39.4,
"capture_points": 40,
"explosion_hits": 0,
"piercings": 3519,
"xp": 376586,
"survived_battles": 136,
"dropped_capture_points": 382,
"damage_dealt": 783555,
"hits_percents": 74,
"draws": 2,
"battles": 290,
"damage_received": 330011,
"frags": 584,
"stun_number": 0,
"direct_hits_received": 1164,
"stun_assisted_damage": 0,
"hits": 4320,
"battle_avg_xp": 1299,
"wins": 202,
"losses": 86,
"piercings_received": 1004,
"no_damage_direct_hits_received": 103,
"shots": 5857,
"explosion_hits_received": 135,
"tanking_factor": 0.04
}
}
]
}
}
for key, val in js['data']['542250529'][0]['all'].items():
print("key:", key, " val:", val)
#Or this way
for key in js['data']['542250529'][0]['all']:
print("key:", key, " val:", js['data']['542250529'][0]['all'][key])
js = {
"status": "ok",
"meta": {
"count": 1
},
"data": {
"542250529": [
{
"all": {
"spotted": 438,
"battles_on_stunning_vehicles": 0,
"avg_damage_blocked": 39.4,
"capture_points": 40,
"explosion_hits": 0,
"piercings": 3519,
"xp": 376586,
"survived_battles": 136,
"dropped_capture_points": 382,
"damage_dealt": 783555,
"hits_percents": 74,
"draws": 2,
"battles": 290,
"damage_received": 330011,
"frags": 584,
"stun_number": 0,
"direct_hits_received": 1164,
"stun_assisted_damage": 0,
"hits": 4320,
"battle_avg_xp": 1299,
"wins": 202,
"losses": 86,
"piercings_received": 1004,
"no_damage_direct_hits_received": 103,
"shots": 5857,
"explosion_hits_received": 135,
"tanking_factor": 0.04
}
}
]
}
}
让我们将这个json“js”命名为一个变量,这个变量将在一个for循环中。
为了更好地理解我在这里做什么,我正在尝试从游戏中收集数据。
这个游戏有数百个不同的坦克,每个坦克都有 tank_id,我可以用它 post tank_id 到游戏服务器并将性能数据响应为“js”。
for tank_id: json = requests.post(tank_id) etc...
并将所有这些值提取到我的数据库中,如屏幕截图所示。
我的 python 代码:
def api_get():
for property in js['data']['542250529']['all']:
spotted = property['spotted']
battles_on_stunning_vehicles = property['battles_on_stunning_vehicles']
# etc
# ...
insert_to_db(spotted, battles_on_stunning_vehicles, etc....)
例外情况是:
for property in js['data']['542250529']['all']:
TypeError: list indices must be integers or slices, not str
以及何时:
print(js['data']['542250529'])
我将 js 的其余部分作为字符串获取,我无法迭代...不能使用有效的 json 字符串,以及 js 中的内容['data'] ['542250529'] 是一个仅包含项目 'all'... 的列表,我们将不胜感激
您刚刚 [0]
未能获得列表中的第一项:
def api_get():
for property in js['data']['542250529'][0]['all']:
spotted = property['spotted']
# ...
仔细看源码中的数据结构JSON.
有一个包含关键字为 all
的字典的列表。所以你需要使用 js['data']['542250529'][0]['all']
而不是 js['data']['542250529']['all']
。然后你可以使用 .items()
来获取键值对。
见下文。
js = {
"status": "ok",
"meta": {
"count": 1
},
"data": {
"542250529": [
{
"all": {
"spotted": 438,
"battles_on_stunning_vehicles": 0,
"avg_damage_blocked": 39.4,
"capture_points": 40,
"explosion_hits": 0,
"piercings": 3519,
"xp": 376586,
"survived_battles": 136,
"dropped_capture_points": 382,
"damage_dealt": 783555,
"hits_percents": 74,
"draws": 2,
"battles": 290,
"damage_received": 330011,
"frags": 584,
"stun_number": 0,
"direct_hits_received": 1164,
"stun_assisted_damage": 0,
"hits": 4320,
"battle_avg_xp": 1299,
"wins": 202,
"losses": 86,
"piercings_received": 1004,
"no_damage_direct_hits_received": 103,
"shots": 5857,
"explosion_hits_received": 135,
"tanking_factor": 0.04
}
}
]
}
}
for key, val in js['data']['542250529'][0]['all'].items():
print("key:", key, " val:", val)
#Or this way
for key in js['data']['542250529'][0]['all']:
print("key:", key, " val:", js['data']['542250529'][0]['all'][key])