Response processing
There is no need to parse JSON - it is already parsed by json.load() and returned as a Python data structure. Use it as a simple dictionary with lists or various dictionaries in it.
Access to the necessary part of the answer
To access the data you must work with, you can use the following:
jsondata['results'][0]['address_components']
where is all the information about geographical names :
[{u'long_name ': u'S \ xf6dra L \ xe4nken', u'types': [u'route '], u'short_name': u'S \ xf6dra L \ xe4nken '}, {u'long_name': u'Stockholm ', u'types': [u'locality', u'political '], u'short_name': u'Stockholm '}, {u'long_name': u'Stockholm ', u'types': [u'administrative_area_level_1 ', u'political'], u'short_name ': u'Stockholm'}, {u'long_name ': u'Sweden', u'types': [u'country ', u'political'], u'short_name ': u'SE'}, {u'long_name ': u'12146', u'types ': [u'postal_code'], u'short_name ': u'12146'}, {u'long_name ': u' Johanneshov ', u'types': [u'postal_town'], u'short_name ': u'Johanneshov'}]
Filtering the data you need
As you can see, there is a lot of data that you do not need, but you only need the locality and administrative_area_level_1 tags. You can filter data using the Python filter() function as follows:
>>> mydata = jsondata['results'][0]['address_components'] >>> types = ['locality', 'administrative_area_level_1'] >>> geonames = filter(lambda x: len(set(x['types']).intersection(types)), mydata)
Basically you get only those elements that have "locality" or "Administrative_area_level_1" in their lists of "types". After the above, geonames will contain a list of dictionaries that you need:
[{u'long_name ': u'Stockholm', u'types ': [u'locality', u'political '], u'short_name': u'Stockholm '}, {u'long_name': u 'Stockholm' , u'types': [u'administrative_area_level_1 ', u'political'], u'short_name ': u'Stockholm'}]
Data display
To display their names, you can, for example. iterate through them, displaying the long_name and corresponding types values:
>>> for geoname in geonames: common_types = set(geoname['types']).intersection(set(types)) print '{} ({})'.format(geoname['long_name'], str(', '.join(common_types))) Stockholm (locality) Stockholm (administrative_area_level_1)
Is this what you expected?
Whole code
The code might look like this:
import json import urllib2 def get_geonames(lat, lng, types): url = 'http://maps.googleapis.com/maps/api/geocode/json' + \ '?latlng={},{}&sensor=false'.format(lat, lng) jsondata = json.load(urllib2.urlopen(url)) address_comps = jsondata['results'][0]['address_components'] filter_method = lambda x: len(set(x['types']).intersection(types)) return filter(filter_method, address_comps) lat, lng = 59.3, 18.1 types = ['locality', 'administrative_area_level_1']