TypeError: объект JSON должен быть str, а не bytes

81

У меня есть следующий, очень простой код, который выдает: 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)

Я пытаюсь установить декодирование для переменной Data, как показано ниже, но выдает ту же ошибку; jData = json.loads(myResponse.content).decode('utf-8')

Какие-либо предложения?

FunnyChef
источник
10
Обратите внимание, что начиная с python 3.6 это больше не проблема
Икар Погорски

Ответы:

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

Вы просто поставили это в неправильном порядке, невинная ошибка.


(Подробный ответ). Как любезно указал wim, в некоторых редких случаях они могут выбрать UTF-16 или UTF-32. Эти случаи будут менее распространены, поскольку разработчики в этом сценарии будут сознательно отказаться от ценной полосы пропускания. Итак, если у вас возникнут проблемы с кодировкой, вы можете изменить utf-8 на 16, 32 и т. Д.

Для этого есть несколько решений. Вы можете использовать встроенную .json()функцию запроса :

myResponse.json()

Или вы можете выбрать распознавание символов через chardet. Chardet - это библиотека, разработанная на основе исследования. Библиотека имеет одну функцию: detect. Detect может обнаруживать наиболее распространенные кодировки, а затем использовать их для кодирования вашей строки с помощью.

import chardet
json.loads(myResponse.content.decode(chardet.detect(myResponse.content)["encoding"]))
Нил
источник
31

Пусть запросы расшифруют это за вас:

data = response.json()

Это проверит заголовки (Content-Type) и кодировку ответа, автоматически определив, как правильно декодировать контент.

слабак
источник
1
Я пробую ваш метод, но получаю сообщение об ошибке: объект InMemoryUploadedFile не имеет атрибута json, это из request.FILES ['file']. Json ()
Manza