I'm trying to get the zip code for a particular city using zippopotam.us. I have the following code which works, except when I try to access the post code key which returns TypeError: expected string or buffer

r = requests.get(') j = r.json() data = json.loads(j) print j['state'] print data['places']['latitude'] 

Full JSON output:

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

4 Answers

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'] 

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(') j = r.json() print j['state'] print j['places'][1]['post code'] 

In your code j is Already json data and j['places'] is list not dict.

 r = requests.get(') j = r.json() print j['state'] for each in j['places']: print each['latitude'] 

I'm using this lib to access nested dict keys

 import requests from addict import Dict r = requests.get(') j = Dict(r.json()) print j.state print j.places[1]['post code'] # only work with keys without '-', space, or starting with number