调用JSON API

时间:2015-12-19 22:32:35

标签: python json api

  

程序将提示输入位置,联系Web服务并检索Web服务的JSON并解析该数据,并从JSON中检索第一个place_id。地点ID是一个文本标识符,用于在Google地图中唯一标识地点。

     

API终点

     

要完成此分配,您应使用具有Google数据静态子集的此API端点:

     

http://python-data.dr-chuck.net/geojson

     

此API使用与Google API相同的参数(传感器和地址)。此API也没有速率限制,因此您可以根据需要进行测试。如果您访问没有参数的URL,您将获得可以与此API一起使用的所有地址值的列表。

import urllib
import json

serviceurl = 'http://python-data.dr-chuck.net/geojson'

while True:
    address = raw_input('Enter location: ')
    if len(address) < 1 : break

    url = serviceurl + urllib.urlencode({'sensor':'false', 'address':  address})
    print 'Retrieving', url
    uh = urllib.urlopen(url)
    data = uh.read()
    print 'Retrieved',len(data),'characters'

    js = json.loads(str(data))

我很困惑place_id在哪里?我只能看到一个包含许多大学名字的名单。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

阅读你的作业:

  

如果您访问没有参数的网址,会获得可以与此API一起使用的所有地址值的列表。

该服务认为您没有传递参数,那是因为您没有正确形成您的网址:

url = serviceurl + urllib.urlencode({'sensor':'false', 'address':  address})

您需要?个问号来将URL路径与查询字符串分开; 使用问号,URL返回带有results键的完整JSON对象:

url = serviceurl + '?' + urllib.urlencode({'sensor':'false', 'address':  address})

生成的JSON对象看起来有点像这样:

{
   "results" : [
      {
         "address_components" : [
             # component dictionaries
         ],
         "formatted_address" : "Virginia Tech Trail, Virginia Beach, VA 23455, USA",
         "geometry" : {
             # geometry dictionary
         },
         "partial_match" : true,
         "place_id" : "ChIJw0P35CuUuokROoH5mxE5Pyg",
         "types" : [ "route" ]
      }
   ],
   "status" : "OK"
}

所以results键是一个列表,包含字典。每个这样的字典都有一个'place_id'密钥。