Home > Enterprise >  How do I do multiple JSON entries with Python?
How do I do multiple JSON entries with Python?

Time:03-02

I'm trying to pull some data from a flight simulation JSON table. It's updated every 15 seconds and I've been trying to pull print(obj['pilots']['flight_plans']['cid']). However im getting the error

Traceback (most recent call last):
  File "main.py", line 18, in <module>
    print(obj['pilots']['flight_plans']['cid'])
TypeError: list indices must be integers or slices, not str

My code is below

import json
from urllib.request import urlopen
import urllib

# initial setup
URL = "https://data.vatsim.net/v3/vatsim-data.json"

# json entries
response = urllib.request.urlopen(URL)
str_response = response.read().decode('utf-8')
obj = json.loads(str_response)


# result is connections
# print(obj["general"]["connected_clients"])

print(obj['pilots']['flight_plans']['cid'])

The print(obj["general"]["connected_clients"]) does work.

CodePudding user response:

Investigate your obj with print(json.dumps(obj,indent=2). You'll find that the pilots key is a list of dictionaries containing flight_plan (not plural) and cid keys. Here's the first few lines:

{
  "general": {
    "version": 3,
    "reload": 1,
    "update": "20220301062202",
    "update_timestamp": "2022-03-01T06:22:02.245318Z",
    "connected_clients": 292,
    "unique_users": 282
  },
  "pilots": [
    {
      "cid": 1149936,
      "name": "1149936",
      "callsign": "URO504",
      "server": "UK",
      "pilot_rating": 0,
      "latitude": -23.39706,
      "longitude": -46.3709,
      "altitude": 9061,
      "groundspeed": 327,
      "transponder": "0507",
      "heading": 305,
      "qnh_i_hg": 29.97,
      "qnh_mb": 1015,
      "flight_plan": {
        "flight_rules": "I",
        "aircraft": "A346",
...

For example, iterate over the list of pilots and print name/cid:

for pilot in obj['pilots']:
    print(pilot['name'],pilot['cid'])

Output:

1149936 1149936
Nick Aydin OTHH 1534423
Oguz Aydin 1429318
Marvin Steglich LSZR 1482019
Daniel Krol EPKK 1279199
... etc ...
  • Related