Разбор файла JSON с помощью Python -> API Google Map - PullRequest
2 голосов
/ 09 января 2011

Я пытаюсь начать работу с JSON в Python, но мне кажется, что я что-то неправильно понимаю в концепции JSON. Я последовал примеру google api , который прекрасно работает. Но когда я изменяю код на более низкий уровень в ответе JSON (как показано ниже, где я пытаюсь получить доступ к расположению), я получаю следующее сообщение об ошибке для приведенного ниже кода:

Traceback (последний последний вызов):
Файл "geoCode.py", строка 11, в
<module>
test = json.dumps ([s ['location'] для s в jsonResponse ['results']], отступ = 3) KeyError: 'location'

Как я могу получить доступ к более низкому уровню информации в файле JSON в python? Нужно ли переходить на более высокий уровень и искать строку результата? Это кажется мне очень странным?

Вот код, который я пытался запустить:

import urllib, json
URL2 = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false"
googleResponse = urllib.urlopen(URL2);
jsonResponse = json.loads(googleResponse.read())
test = json.dumps([s['location'] for s in jsonResponse['results']], indent=3)
print test

Ответы [ 2 ]

17 голосов
/ 09 января 2011

Ключом к пониманию формата jsonResponse является его распечатка:

import urllib, json
import pprint

URL2 = "http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false"

googleResponse = urllib.urlopen(URL2)
jsonResponse = json.loads(googleResponse.read())
pprint.pprint(jsonResponse)
# {u'results': [{u'address_components': [{u'long_name': u'1600',
#                                         u'short_name': u'1600',
#                                         u'types': [u'street_number']},
#                                        {u'long_name': u'Amphitheatre Pkwy',
#                                         u'short_name': u'Amphitheatre Pkwy',
#                                         u'types': [u'route']},
#                                        {u'long_name': u'Mountain View',
#                                         u'short_name': u'Mountain View',
#                                         u'types': [u'locality',
#                                                    u'political']},
#                                        {u'long_name': u'San Jose',
#                                         u'short_name': u'San Jose',
#                                         u'types': [u'administrative_area_level_3',
#                                                    u'political']},
#                                        {u'long_name': u'Santa Clara',
#                                         u'short_name': u'Santa Clara',
#                                         u'types': [u'administrative_area_level_2',
#                                                    u'political']},
#                                        {u'long_name': u'California',
#                                         u'short_name': u'CA',
#                                         u'types': [u'administrative_area_level_1',
#                                                    u'political']},
#                                        {u'long_name': u'United States',
#                                         u'short_name': u'US',
#                                         u'types': [u'country',
#                                                    u'political']},
#                                        {u'long_name': u'94043',
#                                         u'short_name': u'94043',
#                                         u'types': [u'postal_code']}],
#                u'formatted_address': u'1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA',
#                u'geometry': {u'location': {u'lat': 37.4216227,
#                                            u'lng': -122.0840263},
#                              u'location_type': u'ROOFTOP',
#                              u'viewport': {u'northeast': {u'lat': 37.424770299999999,
#                                                           u'lng': -122.0808787},
#                                            u'southwest': {u'lat': 37.418475100000002,
#                                                           u'lng': -122.0871739}}},
#                u'types': [u'street_address']}],
#  u'status': u'OK'}

test = json.dumps([s['geometry']['location'] for s in jsonResponse['results']], indent=3)
print(test)
# [
#    {
#       "lat": 37.4216227, 
#       "lng": -122.0840263
#    }
# ]
  1. jsonResponse - это диктант.
  2. jsonResponse['results'] - список
  3. Цикл for s in jsonResponse['results'] назначает s дикту для каждой итерации цикла.
  4. s['geometry'] - это диктант.
  5. s['geometry']['location'](наконец!) содержит широту / долготу.
0 голосов
/ 22 октября 2013

Сначала запутайте это, потому что загрузка не доступна с import json, это должно быть

import simplejson as json, так:

import urllib
import simplejson as json
import pprint

URL2 = "http://pbx/a/kiosks"

googleResponse = urllib.urlopen(URL2)
jsonResponse = json.loads(googleResponse.read())
pprint.pprint(jsonResponse)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...