TypeError: obiekt JSON musi być str, a nie „bajty”

81

Mam następujący, bardzo podstawowy kod, który rzuca; 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)

Próbuję ustawić dekodowanie na zmienną Data w następujący sposób, ale zgłasza ten sam błąd; jData = json.loads(myResponse.content).decode('utf-8')

Jakieś sugestie?

FunnyChef
źródło
10
Zauważ, że od Pythona 3.6 to już nie jest problem
Ikar Pohorský

Odpowiedzi:

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

Po prostu umieściłeś to w złej kolejności, niewinny błąd.


(Szczegółowa odpowiedź). Jak uprzejmie wskazał Wim, w niektórych rzadkich przypadkach mogli wybrać UTF-16 lub UTF-32. Przypadki te będą mniej powszechne, ponieważ programiści w tym scenariuszu świadomie zdecydowaliby się wyrzucić cenną przepustowość. Tak więc, jeśli napotkasz problemy z kodowaniem, możesz zmienić utf-8 na 16, 32 itd.

Jest na to kilka rozwiązań. Możesz użyć wbudowanej .json()funkcji request :

myResponse.json()

Lub możesz zdecydować się na wykrywanie znaków przez chardet. Chardet to biblioteka stworzona na podstawie badań. Biblioteka posiada jedną funkcję: detect. Detect może wykryć najpopularniejsze kodowania, a następnie użyć ich do zakodowania ciągu za pomocą.

import chardet
json.loads(myResponse.content.decode(chardet.detect(myResponse.content)["encoding"]))
Neil
źródło
31

Pozwól żądaniom odszyfrować to za Ciebie:

data = response.json()

Spowoduje to sprawdzenie nagłówków (Content-Type) i kodowania odpowiedzi, automatycznie wykrywając, jak poprawnie zdekodować zawartość.

wim
źródło
1
Próbuję twojej metody, ale pojawia się błąd: obiekt „InMemoryUploadedFile” nie ma atrybutu „json”, pochodzi z request.FILES [„plik”]. Json ()
Manza