TypeError: Das JSON-Objekt muss str sein, nicht 'bytes'.

81

Ich habe den folgenden, sehr einfachen Code, der wirft; 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)

Ich versuche, die Dekodierung wie folgt auf die Datenvariable zu setzen, aber es wird der gleiche Fehler ausgegeben. jData = json.loads(myResponse.content).decode('utf-8')

Irgendwelche Vorschläge?

FunnyChef
quelle
10
Beachten Sie, dass dies seit Python 3.6 kein Problem mehr ist
Ikar Pohorský

Antworten:

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

Du hast es einfach in die falsche Reihenfolge gebracht, unschuldiger Fehler.


(Ausführliche Antwort). Wie von wim höflich hervorgehoben, konnten sie sich in einigen seltenen Fällen für UTF-16 oder UTF-32 entscheiden. Diese Fälle sind weniger häufig als die Entwickler. In diesem Szenario würden sie sich bewusst dafür entscheiden, wertvolle Bandbreite wegzuwerfen. Wenn Sie also auf Codierungsprobleme stoßen, können Sie utf-8 in 16, 32 usw. ändern.

Hierfür gibt es einige Lösungen. Sie können die integrierte .json()Funktion der Anforderung verwenden:

myResponse.json()

Oder Sie können sich für die Zeichenerkennung über entscheiden chardet. Chardet ist eine Bibliothek, die auf der Grundlage einer Studie entwickelt wurde. Die Bibliothek hat eine Funktion : detect. Detect kann die meisten gängigen Codierungen erkennen und diese dann zum Codieren Ihrer Zeichenfolge verwenden.

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

Lassen Sie Anfragen es für Sie entschlüsseln:

data = response.json()

Dadurch werden die Header (Inhaltstyp) und die Antwortcodierung überprüft und automatisch erkannt, wie der Inhalt korrekt dekodiert wird.

wim
quelle
1
Ich versuche Ihre Methode, aber ich erhalte die Fehlermeldung: 'InMemoryUploadedFile' Objekt hat kein Attribut 'json', dies ist von request.FILES ['file']. Json ()
Manza