web-dev-qa-db-fra.com

Python Accès aux données JSON imbriquées

J'essaie d'obtenir le code postal d'une ville en utilisant zippopotam.us. 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']

Sortie JSON complète:

{
"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 de votre aide.

43
apardes

Je n'avais pas réalisé que le premier élément imbriqué était en réalité un tableau. La manière correcte d’accéder à la clé de code postal est la suivante:

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

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

Places est une liste et non 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 les lieux, puis vous pouvez répertorier les propriétés du lieu. Donc, pour obtenir le premier code postal que vous feriez:

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

Dans votre code j est déjà json data et j ['places'] est une liste non dictée.

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

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

J'utilise cette bibliothèque pour accéder aux clés 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
Ezequiel Bertti