Как получить значение из вложенных массивов? JSON - PullRequest
0 голосов
/ 31 августа 2018

У меня проблема с разбором билетов. Существует ссылка JSON, которая содержит следующие данные: JSON файл

{"success":true,"data":{"AAE":{"2":{"price":48973,"airline":"AF","flight_number":1745,"departure_at":"2018-09-04T18:45:00Z","return_at":"2018-09-14T07:15:00Z","expires_at":"2018-09-02T06:57:21Z"},"3":{"price":67240,"airline":"TP","flight_number":1235,"departure_at":"2018-09-04T07:15:00Z","return_at":"2018-09-14T07:15:00Z","expires_at":"2018-09-02T06:57:21Z"}},"AAH":{"1":{"price":34049,"airline":"LH","flight_number":1453,"departure_at":"2018-09-30T09:05:00Z","return_at":"2018-10-02T07:40:00Z","expires_at":"2018-09-03T11:37:06Z"},"2":{"price":35838,"airline":"LH","flight_number":1453,"departure_at":"2018-09-30T09:05:00Z","return_at":"2018-10-02T11:39:00Z","expires_at":"2018-09-03T11:37:06Z"}},"AAL":{"1":{"price":23258,"airline":"KL","flight_number":904,"departure_at":"2018-12-08T18:00:00Z","return_at":"2018-12-15T06:00:00Z","expires_at":"2018-09-03T13:27:58Z"},"2":{"price":21867,"airline":"AF","flight_number":1745,"departure_at":"2018-12-08T20:00:00Z","return_at":"2018-12-15T18:15:00Z","expires_at":"2018-09-03T13:27:58Z"},"3":{"price":30639,"airline":"AF","flight_number":1145,"departure_at":"2018-12-08T09:45:00Z","return_at":"2018-12-15T06:00:00Z","expires_at":"2018-09-03T13:27:58Z"}},"AAQ":{"0":{"price":5354,"airline":"FV","flight_number":5515,"departure_at":"2018-09-16T04:20:00Z","return_at":"2018-10-04T12:40:00Z","expires_at":"2018-08-31T20:53:40Z"},"1":{"price":8590,"airline":"FV","flight_number":5515,"departure_at":"2018-09-16T04:20:00Z","return_at":"2018-10-04T15:05:00Z","expires_at":"2018-08-31T20:53:40Z"},"2":{"price":13702,"airline":"U6","flight_number":79,"departure_at":"2018-10-04T11:20:00Z","return_at":"2018-10-10T12:40:00Z","expires_at":"2018-09-03T06:47:01Z"}},"AAR":{"1":{"price":24418,"airline":"OK","flight_number":905,"departure_at":"2018-09-19T22:10:00Z","return_at":"2018-09-25T09:35:00Z","expires_at":"2018-09-02T21:16:33Z"},"2":{"price":20805,"airline":"AY","flight_number":712,"departure_at":"2018-09-19T11:50:00Z","return_at":"2018-09-25T16:55:00Z","expires_at":"2018-09-02T21:16:33Z"},"3":{"price":36316,"airline":"BT","flight_number":425,"departure_at":"2018-09-19T09:45:00Z","return_at":"2018-09-25T09:35:00Z","expires_at":"2018-09-02T21:16:33Z"}},

Мой код:

import json
from urllib.request import Request, urlopen

request = Request("http://api.link")
response_body = urlopen(request).read()

tickets = json.loads(response_body)

for item in tickets['data']:
    price = item['AAL']['1']['price']
    print(price)

Я пробовал разные варианты, чтобы узнать цену, но ничего не произошло.

Помогите мне получить это значение

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Я не пробовал это с необработанными данными, которые вы (наконец-то) добавили в свой вопрос - хотя все еще не так, как я предлагал. Вместо этого я вручную набрал (и исправил форматирование) фрагмент, который был показан на изображении, которое вы первоначально разместили.

Несмотря на это, следующее должно быть как минимум близко и показать вам, как получить доступ к различным частям структуры данных:

response_body = '''
{
    "success": true,
    "data": {
        "AAL": {
            "1": {
                "price": 53411,
                "airline": "KL",
                "flight_number": 904,
                "departure_at": "2018-08-31T17:00:002",
                "return_at": "2018-09-01T18:20:002",
                "expires_at": "2018-08-31T17:00:OOZ"
            },
            "2": {
                "price": 56035,
                "airline": "BT",
                "flight_number": 429,
                "departure_at": "2018-08-31T15:25:002",
                "return_at": "2018-09-01To6:35:002",
                "expires_at": "2018-08-31T15:25:OOZ"
            }
        },
        "AAQ": {
            "0": {
                "price": 6242,
                "airline": "DP",
                "flight_number": 147,
                "departure_at": "2018-09-15T21:00:002",
                "return_at": "2018-10-05T12:40:002",
                "expires_at": "2018-09-03T13:18:222"
            }
        }
    }
}'''

Код для обработки данных:

import json

tickets = json.loads(response_body)

for airport, flights in tickets['data'].items():
    print('airport:', airport)
    for id, flight in flights.items():
        print('  id:', id)
        print('    airline:', flight['airline'])
        print('    flight_number:', flight['flight_number'])
        print('    price:', flight['price'])  # Here's how to get the price.
0 голосов
/ 31 августа 2018

Это элемент приведения в виде строки в цикле for. Поэтому, когда вы вызываете ['1'], он выдает ошибку, где, как будто вы устанавливаете его в целое число, то есть [1], он возвращает второй символ ключа, в данном случае «A» from » AAL. Это будет работать, если вы модифицируете его под свои нужды.

import json
from urllib.request import Request, urlopen

request = Request("http://api.travelpayouts.com/v1/prices/cheap?origin=MOW&page=1&      token=77e84779fa444c14806f022f6c41b7fe")
response_body = urlopen(request).read()

tickets = json.loads(response_body)

for item in tickets['data']:
    if item == 'AAL':
        price = tickets['data'][item]['1']['price']

print(price)
0 голосов
/ 31 августа 2018

Я думаю, что эти "1" и "2" являются пунктами list, а не dict. И вам нужно перебирать их. Попробуйте обработать как здесь:

import json
from urllib.request import Request, urlopen

request = Request("http://api.link")
response_body = urlopen(request).read()

tickets = json.loads(response_body)

for key, items in tickets['data'].items():
    for item in items:
        price = item['price']
        print(price)
...