很多时候在 python 中请求 API 我都是一会儿用
response.json
,一会儿用
json.loads
,但是这两个函数的区别我貌似一直没太搞明白,所以趁着这次就把他们解决掉。
resonse.json
此网站
对这个函数的解释如下(经过谷歌翻译):
response.json()
返回结果的 JSON 对象(如果结果是以 JSON 格式编写的,否则会引发错误)。Python 请求通常用于从特定资源 URI 中获取内容。每当我们通过 Python 向指定的 URI 发出请求时,它都会返回一个响应对象。现在,此响应对象将用于访问某些功能,例如内容、标头等。本文围绕如何从响应对象中检查
response.json()
展开。它是请求模块中最常用的方法之一。
简单来说就是当我们使用 request 模块请求 API 返回一个 response 对象的时候,调用这个对象的 json 方法,即可获得该 API 的 json 对象,在 Python 中也就是 dict。
json.loads
上面同样的
网站
里对这个函数也有解释:
json.loads()
方法可用于解析有效的 JSON 字符串并将其转换为 Python 字典。它主要用于将由 JSON 数据组成的原生字符串、字节或字节数组反序列化为 Python Dictionary。
使用这个函数需要先
import json
,上面的话的意思是,对这个函数传入一个 json 字符串,经过解析会返回一个 Python 中的 dict(即
反序列化
)。
看完这两个解析,一切都明朗了,
resonse.json
是针对 response 对象,而
json.loads
是针对 json 字符串,两者最终都返回 dict。
对于下面这段简单的代码:
import requests
response = requests.get('https://api.github.com')
print(response)
data = response.json()
print(data)
print(data["current_user_url"])
可以看出,它就是直接调用 response 函数的 json 函数,最终也成功打印出了结果:
<Response [200]>
{'current_user_url': 'https://api.github.com/user', ...}
https://api.github.com/user
那么,怎么使用 json.loads
得到同样的结果呢,我们知道 response.text
是可以返回响应的字符串的,我们只需要把这个字符串扔给 json.loads
解析就可以了,如下:
import requests
import json
response = requests.get("https://api.github.com")
print(response)
data_text = response.text
data = json.loads(data_text)
print(data)
print(data["current_user_url"])
最终返回了和上面一样的结果。因此,在我这个示例中,resonse.json()
与 json.loads(response.text)
的效果是一样的。