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)

Я намагаюся встановити декодування як змінну даних, як показано нижче, але це видає ту саму помилку; jData = json.loads(myResponse.content).decode('utf-8')

Будь-які пропозиції?


10

Відповіді:


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

Ви просто вкладаєте його в неправильному порядку, невинна помилка.


(Поглиблена відповідь). Як ввічливо зазначив wim, у деяких рідкісних випадках вони могли вибрати UTF-16 або UTF-32. Ці випадки будуть рідше, оскільки розробники в такому випадку свідомо вирішують викинути цінну пропускну здатність. Отже, якщо у вас виникнуть проблеми з кодуванням, ви можете змінити utf-8 на 16, 32 тощо.

Є кілька рішень для цього. Ви можете використовувати вбудовану .json()функцію запиту :

myResponse.json()

Або ви можете вибрати розпізнавання символів через 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 ['файл']. Json ()
Манза

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.