2015-02-10 4 views
2

Я пытаюсь использовать синтаксис, который я узнал здесь, в новом приложении. Я получаю сообщение об ошибке при попытке проанализировать результаты. Я считаю, что я-то недоразумение об этом ответ JSON, так как тот же синтаксис, отлично работает на других приложенияхParsing JSON error

Типичный ответ таков -

outputs = 

[[{u'results': [{u'address_components': [{u'long_name': u'Arumeru', 
              u'short_name': u'Arumeru', 
              u'types': [u'administrative_area_level_2', 
                u'political']}, 
             {u'long_name': u'Arusha', 
              u'short_name': u'Arusha', 
              u'types': [u'administrative_area_level_1', 
                u'political']}, 
             {u'long_name': u'Tanzania', 
              u'short_name': u'TZ', 
              u'types': [u'country', 
                u'political']}], 
       u'formatted_address': u'Arumeru, Tanzania', 
       u'geometry': {u'bounds': {u'northeast': {u'lat': -2.9567556, 
                  u'lng': 37.0479585}, 
              u'southwest': {u'lat': -3.7703911, 
                  u'lng': 36.541356}}, 
           u'location': {u'lat': -3.2923144, 
              u'lng': 36.8250274}, 
           u'location_type': u'APPROXIMATE', 
           u'viewport': {u'northeast': {u'lat': -2.9567556, 
                  u'lng': 37.0479585}, 
              u'southwest': {u'lat': -3.7703911, 
                  u'lng': 36.541356}}}, 
       u'types': [u'administrative_area_level_2', u'political']}], 
    u'status': u'OK'}]] 


output = open('geocoding_results_Tanzania.csv', 'w+') 
writer = csv.DictWriter(output, delimiter=',', fieldnames=['location_lat', 'location_lng']) 
writer.writeheader() 

pprint([results]) 

for results in outputs[0]["results"][0]["geometry"]["location"]: 
params = { 
'location_lat': results['lat'], 
'location_lng': results['lng'], 
} 
writer.writerow(params) 

Ошибка -

location_lat': results['lat'], 
TypeError: string indices must be integers 

Однако, когда я как в соответствии с рекомендациями @Padraic

lat = outputs[0]["results"][0]["geometry"]["location"]['lat'] 
lng = outputs[0]["results"][0]["geometry"]["location"]['lng'] 
print(lat,lng) 

Я получаю правильные значения.

(-3.2923144, 36.8250274) 

Что я делаю неправильно при повторении результатов?

+0

Пожалуйста, покажите код, где ошибка происходит на самом деле. – poke

+0

Покажите, как именно вы получаете ответ.Похоже, вы не расшифровали строку JSON для объектов Python. –

+0

Спасибо за ответы. Ах, так я должен использовать json.dumps? – LearningSlowly

ответ

2

Это results[0][0]["results"], у вас есть список внутри списка.

Итак:

print(results[0][0]["results"][0]["geometry"]) 

гест:

{'location_type': 'APPROXIMATE', 'bounds': {'northeast': {'lat': -2.9567556, 'lng': 37.0479585}, 'southwest': {'lat': -3.7703911, 'lng': 36.541356}}, 'location': {'lat': -3.2923144, 'lng': 36.8250274}, 'viewport': {'northeast': {'lat': -2.9567556, 'lng': 37.0479585}, 'southwest': {'lat': -3.7703911, 'lng': 36.541356}}} 

Вы получаете доступ к неправильному пути, вы можете просто:

loc = results[0][0]["results"][0]["geometry"]["location"] 

lat, long = loc["lat"], loc["lng"] 

print(lat,long) 
-3.2923144 36.8250274 

Выход results[0][0]["results"][0]["geometry"] является ДИКТ:

{'viewport': {'northeast': {'lng': 37.0479585, 'lat': -2.9567556}, 'southwest': {'lng': 36.541356, 'lat': -3.7703911}}, 'location': {'lng': 36.8250274, 'lat': -3.2923144}, 'location_type': 'APPROXIMATE', 'bounds': {'northeast': {'lng': 37.0479585, 'lat': -2.9567556}, 'southwest': {'lng': 36.541356, 'lat': -3.7703911}}} 

Когда вы перебираете results[0][0]["results"][0]["geometry"], вы фактически выполняете итерацию по клавишам в dict, чтобы затем попытаться проиндексировать строку, используя строку, следовательно, ошибку.

+0

Спасибо Padraic. Я попытался - для геометрии в результатах [0] [0] ["results"] [0] ['geometry']: params = { "location_lat": geometry ['location'] ['lat'], " location_lng ": geometry ['location'] ['lng'], } Но я получаю keyError: 0 – LearningSlowly

+0

@LearningSlowly. Я отправил то, что получаю, используя структуру, предоставленную с помощью 'results [0] [0] [" results "] [0] [" geometry "]', вы можете проверить, что вы предоставили правильный формат ввода –

+0

Извинения, я сделал пропустите линию. См. Правки выше. Означает ли это? – LearningSlowly

0

Так что - на линии, вставленной в сеанс «Ошибка» выше, у вас есть буквальный экспресс-экспресс на Python - ['results'] на этой строке является жестко запрограммированной строкой внутри заблокированного списка, а не ссылкой на предыдущие данные, которые вы декодировали. Ваше выражение принимает [0]-й элемент от ['results'], который является строкой 'results' и пытается нанести на нее элемент ['geometry'].

Попытка:

location_lat = results[0][0][u'results'][0][u'geometry'] 

вместо

-1

здесь является pprint.pprint (результат) Выход:

[[{u'results': [{u'address_components': [{u'long_name': u'Arumeru', 
              u'short_name': u'Arumeru', 
              u'types': [u'administrative_area_level_2', 
                u'political']}, 
             {u'long_name': u'Arusha', 
              u'short_name': u'Arusha', 
              u'types': [u'administrative_area_level_1', 
                u'political']}, 
             {u'long_name': u'Tanzania', 
              u'short_name': u'TZ', 
              u'types': [u'country', 
                u'political']}], 
       u'formatted_address': u'Arumeru, Tanzania', 
       u'geometry': {u'bounds': {u'northeast': {u'lat': -2.9567556, 
                  u'lng': 37.0479585}, 
              u'southwest': {u'lat': -3.7703911, 
                  u'lng': 36.541356}}, 
           u'location': {u'lat': -3.2923144, 
              u'lng': 36.8250274}, 
           u'location_type': u'APPROXIMATE', 
           u'viewport': {u'northeast': {u'lat': -2.9567556, 
                  u'lng': 37.0479585}, 
              u'southwest': {u'lat': -3.7703911, 
                  u'lng': 36.541356}}}, 
       u'types': [u'administrative_area_level_2', u'political']}]}]] 

для цикла statament 'для геометрии в результатах [' Результаты] [0] ['geometry'] 'получает только значение ключа ниже dict

{u'bounds': {u'northeast': {u'lat': -2.9567556, u'lng': 37.0479585}, 
      u'southwest': {u'lat': -3.7703911, u'lng': 36.541356} 
      }, 
u'location': {u'lat': -3.2923144, u'lng': 36.8250274}, 
u'location_type': u'APPROXIMATE', 
u'viewport': {u'northeast': {u'lat': -2.9567556, u'lng': 37.0479585}, 
       u'southwest': {u'lat': -3.7703911, u'lng': 36.541356} 
       } 
} 

поэтому местоположение информация должна быть получена следующим образом

geometry = results[0][0]['results'][0]['geometry'] 
params = { 
"location_lat": geometry['location']['lat'], 
"location_lng": geometry['location']['lng'], 
} 

pprint.pprint(params)