response.json()与 json.loads(json_string)有何区别
response.json() 和 json.loads() 的最终目标是一致的:将 JSON 格式的数据转换为 Python 对象(字典或列表)。但它们的使用场景和底层实现有所不同。
您可以将其理解为:response.json() 是一个“高级、便捷、特化”的工具,而 json.loads() 是一个“基础、通用、底层”的工具。
下面我用一个详细的对比表格来展示它们的异同,并辅以代码示例进行说明。
代码示例与解释
场景一:处理 HTTP 响应(最常用)
这是您在自动化测试中最常见的场景。在这种场景下,使用 response.json() 是绝对的首选和最佳实践,因为它更简洁、更安全(自动处理编码)。
import requests
import json# 使用 requests 库发送 HTTP 请求
response = requests.get('https://api.example.com/data')# 最佳方式:直接使用 .json()
data_from_response_json = response.json()
print(type(data_from_response_json)) # <class 'dict'>
print(data_from_response_json['some_key'])# 等效的底层方式:手动使用 json.loads()
# 1. 先获取文本内容 (response.text 会自动解码二进制内容为字符串)
response_text = response.text
# 2. 再将字符串解析为字典
data_from_json_loads = json.loads(response_text)# 此时,data_from_response_json 和 data_from_json_loads 是完全等价的
为什么 response.json() 更好?
简洁:一行代码完成所有事情。
健壮:它内置了编码检测逻辑,能处理绝大多数情况下的编码问题。如果你用 json.loads(response.text),而服务器返回的编码和 response.text 默认猜测的编码不一致,就可能出现乱码。而 response.json() 会参考 HTTP 头中的 charset 信息,更加可靠。
场景二:处理普通 JSON 字符串
当你的数据来源不是 HTTP 响应,而就是一个单纯的字符串时,你必须使用 json.loads()。
import json# 一个 JSON 格式的字符串,可能来自文件、用户输入、数据库等
json_string = '{"name": "Alice", "age": 30, "hobbies": ["coding", "hiking"]}'# 只有 json.loads() 能处理它
data = json.loads(json_string)
print(type(data)) # <class 'dict'>
print(data['name']) # Alice# response.json() 在此完全无用武之地,因为它需要的是一个 Response 对象,而不是字符串。
# response = json_string # 这行代码是错误的,字符串不是 Response 对象
# data = response.json() # 所以这行也会报错
错误处理
两者在遇到非法 JSON 时的行为是一致的:
import requests
import json# 模拟一个无效的 JSON 字符串
invalid_json_string = '{name: "Alice"}' # 键缺少了引号,是无效JSON# 使用 json.loads() 会抛出异常
try:data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:print(f"json.loads() failed: {e}")# 模拟一个返回无效 JSON 的 HTTP 响应(例如,服务器返回了一个错误页面 HTML)
response = requests.get('https://httpbin.org/html') # 这个端点返回 HTML,不是 JSONtry:data = response.json() # 这里也会抛出 JSONDecodeError
except requests.exceptions.JSONDecodeError as e: # requests 包装了同样的异常print(f"response.json() failed: {e}")
总结与类比
为了让您更好地理解,这里有一个简单的类比:
json.loads(json_string):就像是你买了一袋咖啡豆,你需要自己用磨豆机去磨它(json.loads),然后才能煮咖啡。
response.json():就像是你去咖啡馆点了一杯现磨咖啡,店员(requests 库)已经帮你完成了从磨豆到冲泡的所有步骤,你直接喝就行了。
共同点(都是“咖啡”):最终都能得到一杯可以喝的咖啡(Python 字典)。
不同点(过程不同):一个需要自己处理原材料,另一个是开箱即用的成品。
在自动化测试中的建议:
但凡是从 requests 请求得到的 response,一律使用 response.json()。这是最规范、最不容易出错的方式。
只有当你的数据源是其他地方来的字符串时,才使用 json.loads()。