2015-02-10 192 views
2

我正嘗試使用我從這裏學到的語法在新的應用程序上。當我嘗試解析結果時出現錯誤。我相信我誤解的東西這個JSON響應,因爲相同的語法同樣適用於其他應用程序解析JSON錯誤

精細

典型迴應如下 -

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 2015-02-10 10:09:25

+0

準確顯示您如何獲得回覆。好像你還沒有將JSON字符串解碼爲Python對象。 – 2015-02-10 10:11:39

+0

感謝您的回覆。啊,所以我應該使用json.dumps? – LearningSlowly 2015-02-10 10:15:20

回答

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"]時,您實際上正在遍歷字典中的鍵,因此您正嘗試使用字符串索引字符串,因此出現錯誤。

+0

謝謝Padraic。我嘗試過 - 對於結果中的幾何[0] [0] [「結果」] [0] ['幾何']: params = {location_lat「:geometry ['location'] ['lat'], 」 location_lng「:geometry ['location'] ['lng'], } 但是我得到keyError:0 – LearningSlowly 2015-02-10 10:25:41

+0

@LearningSlowly。我發佈了使用'results [0] [0] [「results」] [0] [「geometry」]提供的結構獲得的結果,你可以仔細檢查你是否提供了正確的輸入格式 – 2015-02-10 10:38:06

+0

道歉,我做了錯過一條線。請參閱上面的編輯。這是澄清嗎? – LearningSlowly 2015-02-10 10:55:28

0

因此 - 在上面的會話「錯誤」上粘貼的行上,您有一個字面Python表達式 - 該行上的['results']是hardocded列表中的硬編碼字符串,而不是對已解碼的以前數據的引用。您的表達式取自['results'][0]'th元素,它是字符串'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']}]}]] 

for循環statament '在結果中爲幾何[' 結果] [0] ['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} 
       } 
} 

所以位置信息應該得到如下

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

pprint.pprint(params)