很多时候在 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 requestsresponse = requests.get('https://api.github.com')print(response)data = response.json()print(data)print(data["current_user_url"])
可以看出,它就是直接调用 response 函数的 json 函数,最终也成功打印出了结果:
{'current_user_url': 'https://api.github.com/user', ...}https://api.github.com/user
那么,怎么使用 json.loads
得到同样的结果呢,我们知道 response.text
是可以返回响应的字符串的,我们只需要把这个字符串扔给 json.loads
解析就可以了,如下:
import requestsimport jsonresponse = requests.get("https://api.github.com")print(response)data_text = response.textdata = json.loads(data_text)print(data)print(data["current_user_url"])
最终返回了和上面一样的结果。因此,在我这个示例中,resonse.json()
与 json.loads(response.text)
的效果是一样的。