解析JSON

2024-09-29 23:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个新的应用程序中使用从这里学到的语法。我试图解析结果时出错。我相信我对这个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)

迭代结果时我做错了什么?你知道吗


Tags: namearealocationoutputslevelresultslongtypes
3条回答

这是你的名字打印.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循环statement'for geometry in results['results'][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)

它是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"]的输出是dict:

{'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中的键上进行迭代,因此您试图使用一个字符串来索引一个字符串,因此出现了错误。你知道吗

因此-在上面的会话“Error”上粘贴的一行中有一个Python文本表达式-['results']在该行中是硬编码列表中的硬编码字符串,而不是对已解码的先前数据的引用。表达式从['results']中获取第[0]个元素,即字符串'results',并尝试从该元素中选取['geometry']元素。你知道吗

尝试:

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

相反

相关问题 更多 >

    热门问题