我正在用json数据练习python。我遇到了.json()方法和json.loads()。两者都返回相同的输出。我想知道两者之间是否有任何区别。
r = request.get('name of url')
text = r.text
data = json.loads(text)
r = request.get('name of url')
data1 = r.json()
data和data1具有相同的“ dict”类型,并返回相同的输出。为什么我们要使用一个与另一个。为什么有见识?
答案 0 :(得分:2)
.json
是requests.models.Response
类的方法。它从请求的响应中返回json主体数据。
import requests
r = requests.get('https://reqres.in/api/users?page=2')
print(type(r)) # <class 'requests.models.Response'>
r.json()
loads
是json
包中的函数,用于解析字符串数据
import json
print(type(r.text)) # <class 'str'>
json.loads(r.text)
json.loads
可以与任何字符串数据一起使用,不仅可以在请求上下文中使用
json.loads('{"key": "value"}')
答案 1 :(得分:1)
有 2 个细微差别。
输入是不同的。假设 r = requests.get(...)
,
r.json()
输出类型 dict
,但接受类型 requests.models.Response
。
json.loads(r.text)
输出类型 dict
,但接受类型 string
。
编码假设不同:
r.json()
通过额外的步骤来检测编码
在处理输入之前,了解更多详情here。
json.loads(r.text)
假定默认编码为“UTF-8”
并处理输入。
总而言之,如果您确定输入是“UTF-8”编码,请使用 json.loads(r.text)
。要获得更可靠的方法而无需检查编码,请使用 r.json()
(我个人更喜欢这个)。
答案 2 :(得分:0)
答案 3 :(得分:0)
json
对象的requests.models.Response
方法最终调用了json.loads
方法,但是它可能还会做更多的事情。
您可以在requests.models.Response.json
source code中看到它有时会在调用complexjson.loads
(实际上是json.loads
)之前尝试猜测编码:
if not self.encoding and self.content and len(self.content) > 3:
# No encoding set. JSON RFC 4627 section 3 states we should expect
# UTF-8, -16 or -32. Detect which one to use; If the detection or
# decoding fails, fall back to `self.text` (using chardet to make
# a best guess).
encoding = guess_json_utf(self.content)
因此,似乎通常使用r.json()
比json.loads(r.text)
更好。