JSON или Python проблема декодирования из-за диктовок / списков - PullRequest
0 голосов
/ 31 декабря 2018

Я использовал приведенный ниже скрипт Python, чтобы попытаться извлечь и извлечь некоторые данные из Flightradar24, может показаться, что он извлекает данные в формате JSON и полностью распечатывает их, используя json.dumps, но когда я пытаюсьдля выбора нужных мне данных (в данном случае текста статуса) с помощью get выдается следующая ошибка:

У объекта 'list' нет атрибута 'get'

Данные в формате JSON или список?Я сейчас совершенно сбит с толку.

Я довольно новичок в работе с данными в формате JSON, любая помощь будет признательна!

Сценарий:

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)

Пример выходных данных:

{
"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
},

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Проблема, как отмечает @PatrickArtner, заключается в том, что ваш data на самом деле является списком, а не словарем.Кроме того, вы можете найти свой код более читабельным, если бы вы использовали вспомогательную функцию для многократного применения dict.get во вложенном словаре:

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']])
0 голосов
/ 31 декабря 2018

Вы можете использовать print(type(variable_name)), чтобы увидеть, какой это тип..get(key[,default]) не поддерживается в списках - оно поддерживается для dict.

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

, поскольку data является списком dict s:

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

Это должно работать:

 X = (flight.get('result').get('response').get('data')[0].get('status').get('text')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...