访问嵌套 JSON 数据

我想用 zippopotam.us 找到某个城市的邮政编码。我有下面的代码工作,除了当我尝试访问返回 TypeError: expected string or bufferpost code

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"
}
330883 次浏览

I did not realize that the first nested element is actually an array. The correct way access to the post code key is as follows:

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


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

Places is a list and not a dictionary. This line below should therefore not work:

print(data['places']['latitude'])

You need to select one of the items in places and then you can list the place's properties. So to get the first post code you'd do:

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

In your code j is Already json data and j['places'] is list not 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']

I'm using this lib to access nested dict keys

https://github.com/mewwts/addict

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


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