Python 中 response.json 和 json.loads 的区别,问题分析resons


很多时候在 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) 的效果是一样的。

评论关闭