Python accédant à des données JSON imbriquées

j'essaie d'obtenir le code postal d'une ville en particulier en utilisant zippopotam.nous. J'ai le code suivant qui fonctionne, sauf quand j'essaie d'accéder au post code touche qui retourne 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']

Plein de sortie 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"
}

Merci pour votre aide.

33
demandé sur apardes 2014-04-26 08:30:06

4 réponses

Lieux est une liste qui n'est pas un dictionnaire. Cette ligne ci-dessous ne devrait donc pas fonctionner:

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

Vous devez sélectionner l'un des éléments dans des lieux et ensuite, vous pouvez lister les propriétés. Ainsi, pour obtenir le premier code postal que vous feriez:

print data['places'][0]['post code']
44
répondu agrinh 2014-04-26 04:41:03

je ne savais pas que le premier élément imbriqué est en fait un tableau. La bonne façon de l'accès au code postal de la clé est comme suit:

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

print j['state']
print j['places'][1]['post code']
17
répondu apardes 2014-04-26 04:40:16

Dans votre code j est Déjà données json et j [lieux] n'est pas 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']
7
répondu MONTYHS 2014-04-28 09:20:49

j'utilise cette lib pour accéder à des touches dict imbriquées

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 
5
répondu Ezequiel Bertti 2017-03-30 14:48:55