Обработка ответа
Нет необходимости анализировать JSON - он уже проанализирован json.load()
и возвращен как структура данных Python. Используйте его как простой словарь со списками или различными словарями.
Доступ к необходимой части ответа
Для доступа к данным, с которыми вы должны работать, вы можете использоватьследующие:
jsondata['results'][0]['address_components']
, куда входит вся информация о географических названиях :
[{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'hort_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'}]
Фильтрация нужных вам данных
Как видите, существует множествоАта вам не нужна, но вам нужна только locality
и administrative_area_level_1
информация.Вы можете фильтровать данные, используя filter()
функцию Python следующим образом:
>>> mydata = jsondata['results'][0]['address_components']
>>> types = ['locality', 'administrative_area_level_1']
>>> geonames = filter(lambda x: len(set(x['types']).intersection(types)), mydata)
В основном вы получаете только элементы, которые имеют 'locality' или 'administrator_area_level_1' в своих списках "типов".После вышесказанного, geonames
будет список, содержащий словари, которые вам необходимы:
[{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'}]
Отображение данных
Для отображения их имен вы можете, например,.итерируйте их, отображая long_name
s и соответствующие types
значения:
>>> 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)
Это то, что вы ожидали?
Весь код
Код может выглядеть следующим образомэто:
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']
# Display all geographical names along with their types
for geoname in get_geonames(lat, lng, types):
common_types = set(geoname['types']).intersection(set(types))
print '{} ({})'.format(geoname['long_name'], ', '.join(common_types))