Andy McC
Andy McC

Reputation: 21

JSON or Python dict / list decoding problem

I have been using the Python script below to try and retrieve and extract some data from Flightradar24, it would appear that it extracts the data in JSON format and will print the data out ok fully using json.dumps, but when I attempt to select the data I want (the status text in this case) using get it gives the following error:

'list' object has no attribute 'get'

Is the Data in JSON or a List ? I'm totally confused now.

I'm fairly new to working with data in JSON format, any help would be appreciated!

Script:

import flightradar24
import json

flight_id = 'BA458' 
fr = flightradar24.Api()
flight = fr.get_flight(flight_id)

y = flight.get("data")
print (json.dumps(flight, indent=4))

X= (flight.get('result').get('response').get('data').get('status').get('text'))
print  (X)

Sample of output data:

{
"result": {
"request": {
"callback": null,
"device": null,
"fetchBy": "flight",
"filterBy": null,
"format": "json",
"limit": 25,
"page": 1,
"pk": null,
"query": "BA458",
"timestamp": null,
"token": null
},
"response": {
"item": {
"current": 16,
"total": null,
"limit": 25
},
"page": {
"current": 1,
"total": null
},
"timestamp": 1546241512,
"data": [
{
"identification": {
"id": null,
"row": 4852575431,
"number": {
"default": "BA458",
"alternative": null
},
"callsign": null,
"codeshare": null
},
"status": {
"live": false,
"text": "Scheduled",
"icon": null,
"estimated": null,
"ambiguous": false,
"generic": {
"status": {
"text": "scheduled",
"type": "departure",
"color": "gray",
"diverted": null
},

Upvotes: 2

Views: 145

Answers (2)

jpp
jpp

Reputation: 164693

The issue, as pointed out by @PatrickArtner, is your data is actually a list rather than a dictionary. As an aside, you may find your code more readable if you were to use a helper function to apply dict.get repeatedly on a nested dictionary:

from functools import reduce

def ng(dataDict, mapList):
    """Nested Getter: Iterate nested dictionary"""
    return reduce(dict.get, mapList, dataDict)

X = ng(ng(flight, ['result', 'response', 'data'])[0], ['status'[, 'text']])

Upvotes: 1

Patrick Artner
Patrick Artner

Reputation: 51653

You can use print(type(variable_name)) to see what type it is. The .get(key[,default]) is not supported on lists - it is supported for dict's.

X = (flight.get('result').get('response').get('data').get('status').get('text'))
#                                            ^^^^^^^^ does not work, data is a list of dicts

as data is a list of dicts:

"data": [          # <<<<<< this is a list
{
"identification": {
"id": null,
"row": 4852575431,
"number": {
"default": "BA458",
"alternative": null
},
"callsign": null,
"codeshare": null
},
"status": {

This should work:

 X = (flight.get('result').get('response').get('data')[0].get('status').get('text')

Upvotes: 1

Related Questions