Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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
            }
         }
      ]
   }
}

Let us name this json "js" as a variable, this variable will be in a for-loop.
To understand better what I’m doing here, I’m trying to collect data from a game.
This game has hundreds of different tanks, each tank has tank_id with which I can post tank_id to the game server and respond the performance data as "js".
for tank_id: json = requests.post(tank_id) etc...
and fetch all these values to my database as shown in the screenshot.
database

my python code for it:

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....)

the exception is:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

for property in js['data']['542250529']['all']:
 TypeError: list indices must be integers or slices, not str

and when:

print(js['data']['542250529'])

i get the rest of the js as a string, and i can’t iterate… can’t be used a valid json string, also what’s inside js[‘data’][‘542250529’] is a list containing only the item ‘all’…, any help would be appreciated

>Solution :

You just missed [0] to get the first item in a list:

def api_get():
   for property in js['data']['542250529'][0]['all']:
       spotted = property['spotted']
# ...

Look carefully at the data structure in the source JSON.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading