2015-02-10 174 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)