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"
}
ご協力いただきありがとうございます。
最初のネストされた要素が実際には配列であることを知りませんでした。郵便番号キーへの正しいアクセス方法は次のとおりです。
r = requests.get('http://api.zippopotam.us/us/ma/belmont')
j = r.json()
print j['state']
print j['places'][1]['post code']
場所はリストであり、辞書ではありません。したがって、次の行は機能しません。
print data['places']['latitude']
プレース内のアイテムのいずれかを選択する必要があり、プレースのプロパティをリストできます。だからあなたが最初の郵便番号を取得するには:
print data['places'][0]['post code']
コードでは、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']
私はこのライブラリを使用してネストされた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