web-dev-qa-db-ja.com

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"
}

ご協力いただきありがとうございます。

43
apardes

最初のネストされた要素が実際には配列であることを知りませんでした。郵便番号キーへの正しいアクセス方法は次のとおりです。

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

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

場所はリストであり、辞書ではありません。したがって、次の行は機能しません。

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

プレース内のアイテムのいずれかを選択する必要があり、プレースのプロパティをリストできます。だからあなたが最初の郵便番号を取得するには:

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

コードでは、jはすでにjsonデータであり、j ['places']はリストではなく辞書です。

 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

私はこのライブラリを使用してネストされたdictキーにアクセスしています

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