我对 JSON 还很陌生。我的代码包括从需要 API 密钥的网站提取数据。提取信息后。我试图通过这种格式获取以 JSON 编码的信息(这里是一个示例):
[{"number":31705,"name":"31705 - CHAMPEAUX (BAGNOLET)","address":"RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET","latitude":48.8645278209514,"longitude":2.416170724425901},{"number":10042,"name":"10042 - POISSONNIÈRE - ENGHIEN","address":"52 RUE D'ENGHIEN / ANGLE RUE DU FAUBOURG POISSONIERE - 75010 PARIS","latitude":48.87242006305313,"longitude":2.348395236282807}]
如何访问 JSON 代码中的不同数据?这是我想出的代码:
import requests
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{station_number}?contract={contract_name}&api_key HTTP/1.1')
我相信我的请求已经制定了一个响应,该响应位于网站已发送到我的计算机的“响应”“文件夹”中:
print(reponse.headers)
print(reponse(2,/'latitude')
我试图访问 JSON 代码的每个元素中的纬度信息 - 2 代表列表的第二个元素,纬度是我尝试在 JSON 列表的元素中访问的值的名称。但我无法做到这一点。我得到的错误是语法错误。
如何解决?我想访问对象“response”每个成员的每个字符串的所有值。
更新n°1:
我的新代码是:
import json
import requests
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1')
data = json.loads(response.content)
print(data)
但是我收到错误:
Traceback (most recent call last):
File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 27, in <module>
data = json.loads(response.content)
File "/Users/someone/miniconda3/lib/python3.5/json/__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
更新n°2:
我的新代码是:
import json
import requests
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1')
data = response.json()
latitude = data[2]['latitude']
但是我收到错误:
Traceback (most recent call last):
File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 30, in <module>
latitude = data[2]['latitude']
KeyError: 2
这是否意味着回复为空?
更新n°3:
reponse.content
答案如下:
b'{ "error" : "Unauthorized" }'
有什么问题吗?
更新 n°4:
我的新代码是:
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1')
data = json.loads(response.content.decode('utf-8'))
print(reponse.headers)
print(reponse.content)
结果是:
{'Content-Length': '48', 'Content-Encoding': 'gzip', 'Server': 'Apache-Coyote/1.1', 'Date': 'Fri, 23 Sep 2016 19:39:25 GMT', 'Connection': 'close', 'Content-Type': 'application/json'}
b'{ "error" : "Unauthorized" }'
所以我的请求的答案不为空,但我没有访问它的授权。我该如何解决这个问题?
最终更新:
新的工作代码是:
import json
import requests
r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0')
response_json = r.json()
print (response_json['name'])
结果是:
31705 - CHAMPEAUX (BAGNOLET)
您可以将
json
数据转换为字典,然后像字典一样访问它。
我相信它应该是这样的
data = json.loads(response.content.decode('utf-8'))
你的网址搞乱了。我不确定
HTTP/1.1
后缀是什么意思,但 id 绝对不属于这里。另外,大括号中的所有参数看起来都不对。
import requests
r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0')
response_json = r.json()
print response_json
此代码片段打印:
{u'status': u'OPEN', u'contract_name': u'Paris', u'name': u'31705 - CHAMPEAUX (BAGNOLET)', u'bonus': True, u'bike_stands': 50, u'number': 31705, u'last_update': 1474660046000, u'available_bike_stands': 49, u'banking': True, u'available_bikes': 1, u'address': u'RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET', u'position': {u'lat': 48.8645278209514, u'lng': 2.416170724425901}}
总而言之,
response_json
现在是一个标准的Python字典,可以使用标准字典协议从中访问数据。
print response_json['status'] # prints OPEN
Requests 有内置的 JSON 解码器,因此不需要使用 json 库:
import requests
response = requests.get(url)
data = response.json()
根据您问题中的详细信息,“数据”可能是包含纬度的字典列表。 因此,提取第一个可能是:
latitude = data[0]['latitude']
但是您可能需要首先以交互方式处理响应以进行确定。