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?
Odpowiedzi:
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 :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"]))
źródło
Pozwól żądaniom odszyfrować to za Ciebie:
Spowoduje to sprawdzenie nagłówków (Content-Type) i kodowania odpowiedzi, automatycznie wykrywając, jak poprawnie zdekodować zawartość.
źródło
python3.6 + robi to automatycznie, więc twój kod nie powinien zwracać błędu w python3.6 +
co nowego w Pythonie 3.6
źródło