遍历 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])