类型错误:JSON对象必须是字符串,而不是'bytes'。

90

我有一段非常基本的代码,出现了以下错误:TypeError: the JSON object must be str, not 'bytes'

import requests
import json

url = 'my url'
user = 'my user'
pwd = 'my password'

response = requests.get(url, auth=(user, pwd))

if(myResponse.ok):
    Data = json.loads(myResponse.content)

我尝试将解码设置为数据变量,如下所示,但它仍然抛出相同的错误:jData = json.loads(myResponse.content).decode('utf-8')

有任何建议吗?


11
请注意,自 Python 3.6 开始,这不再是一个问题 - Ikar Pohorský
3个回答

152
json.loads(myResponse.content.decode('utf-8'))

你只是把它放错了位置,这是一个无辜的错误。


(深入解答)正如wim所指出的那样,在一些罕见的情况下,他们可以选择UTF-16或UTF-32。在这种情况下,开发人员会有意地决定丢弃宝贵的带宽,因此这种情况会更少见。所以,如果你遇到编码问题,你可以将UTF-8改为16、32等。

有几个解决方案。你可以使用request内置的.json()函数:

myResponse.json()

或者,您可以选择使用chardet进行字符检测。 Chardet是一个基于研究开发的库。 该库只有一个函数:detect。 检测可以检测到大多数常见的编码,然后将它们用于对字符串进行编码。

import chardet
json.loads(myResponse.content.decode(chardet.detect(myResponse.content)["encoding"]))

32

让 requests 为您进行解码:

data = response.json()

这将检查头信息(Content-Type)和响应编码,自动检测如何正确解码内容。


1
我正在尝试您的方法,但是出现了错误:'InMemoryUploadedFile'对象没有属性'json',这是来自request.FILES ['file'] .json()的。 - Manza

18

Python3.6+会自动处理这个问题,因此您的代码在Python3.6+中不应返回错误。

Python 3.6 的新特性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接