Подтвердить что ты не робот

Python Доступ к вложенным данным JSON

Я пытаюсь получить почтовый индекс для определенного города, используя zippopotam.us. У меня есть следующий код, который работает, за исключением случаев, когда я пытаюсь получить ключ post code, который возвращает TypeError: expected string or buffer

r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()

data = json.loads(j)

print j['state']
print data['places']['latitude']

Полный вывод JSON:

{
"country abbreviation": "US",
"places": [
    {
        "place name": "Belmont",
        "longitude": "-71.4594",
        "post code": "02178",
        "latitude": "42.4464"
    },
    {
        "place name": "Belmont",
        "longitude": "-71.2044",
        "post code": "02478",
        "latitude": "42.4128"
    }
],
"country": "United States",
"place name": "Belmont",
"state": "Massachusetts",
"state abbreviation": "MA"
}

Спасибо за вашу помощь.

4b9b3361

Ответ 1

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

r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()

print j['state']
print j['places'][1]['post code']

Ответ 2

Места - это список, а не словарь. Поэтому эта строка ниже не работает:

print data['places']['latitude']

Вам нужно выбрать один из элементов в местах, а затем вы можете указать свойства места. Итак, чтобы получить первый почтовый код, который вы бы сделали:

print data['places'][0]['post code']

Ответ 3

В вашем коде j есть уже json-данные, а j ['places'] - это список не dict.

 r = requests.get('http://api.zippopotam.us/us/ma/belmont')
 j = r.json()

 print j['state']
 for each in j['places']:
    print each['latitude']

Ответ 4

Я использую эту библиотеку для доступа к вложенным файлам ключей

https://github.com/mewwts/addict

 import requests
 from addict import Dict
 r = requests.get('http://api.zippopotam.us/us/ma/belmont')
 ad = Dict(r.json())

 print j.state
 print j.places[1]['post code']  # only work with keys without '-', space, or starting with number