如何从嵌套数组中获取值? JSON

问题描述 投票:2回答:3

解析票证时遇到问题。有一个JSON链接包含以下数据:json file

{"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)

我尝试了各种方案来获得价格的价值,但没有发生任何事情。

帮助我获得这个价值

python json python-3.x parsing jsonparser
3个回答
3
投票

我没有尝试使用您(最终)在您的问题中添加的原始数据 - 尽管仍然没有我建议的文本。相反,我手动输入(并修复了)您最初发布的图像中显示的片段(并修复了格式)。

无论如何,以下内容至少应该是关闭的,并向您展示如何访问数据结构的各个部分:

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
投票

我认为这些“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)

0
投票

它是在for循环中将项目转换为字符串。所以当你调用['1']时它会抛出一个错误,就好像你把它设置为一个整数,即[1]它会带回键的第二个字符,在这种情况下'A'来自' 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)
© www.soinside.com 2019 - 2024. All rights reserved.