Expecting value: line 1 column 1 (char 0)
Beim Versuch, JSON zu dekodieren , wird eine Fehlermeldung angezeigt.
Die URL, die ich für den API-Aufruf verwende, funktioniert im Browser einwandfrei, gibt diesen Fehler jedoch aus, wenn dies über eine Curl-Anforderung erfolgt. Das Folgende ist der Code, den ich für die Curl-Anfrage verwende.
Der Fehler tritt bei auf return simplejson.loads(response_json)
response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)
def web_fetch(self, url):
buffer = StringIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.TIMEOUT, self.timeout)
curl.setopt(curl.WRITEFUNCTION, buffer.write)
curl.perform()
curl.close()
response = buffer.getvalue().strip()
return response
Vollständiger Traceback:
Zurück verfolgen:
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
620. apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
176. return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
455. return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
374. obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
393. return self.scan_once(s, idx=_w(s, idx).end())
Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
print repr(response_json)
Ihnen, wird weitergegeben.loads()
?simplejson
wenn Sie nur die stdlib verwenden könnenjson
(die dieselbe Bibliothek wiesimplejson
)?web_fetch()
Anruf ist fehlgeschlagen.pycurl
.requests
bietet eine weitaus einfachere API, insbesondere beim Debuggen von Vorgängen. Wenn Sie nicht speziell über eine neuere Version dersimplejson
Bibliothek verfügen müssen , bleibenjson
Sie einfach bei , um eine zu verwaltende Abhängigkeit zu vermeiden.response_json
der Rückgabewert von.json()
? Dann haben Sie bereits Daten dekodiert und müssen diese nichtjson.loads()
mehr verwenden.response
entschlüsselt es für Sie.Antworten:
Um das Gespräch in den Kommentaren zusammenzufassen:
Es ist nicht erforderlich, eine
simplejson
Bibliothek zu verwenden. Python enthält dieselbe Bibliothek wie dasjson
Modul.Es ist nicht erforderlich, eine Antwort von UTF8 auf Unicode zu dekodieren. Die Methode
simplejson
/json
.loads()
kann UTF8-codierte Daten nativ verarbeiten.pycurl
hat eine sehr archaische API. Sofern Sie keine besonderen Anforderungen für die Verwendung haben, gibt es bessere Möglichkeiten.requests
bietet die benutzerfreundlichste API, einschließlich JSON-Unterstützung. Wenn Sie können, ersetzen Sie Ihren Anruf durch:quelle
requests
! Die Spur scheint darauf hinzudeuten, dassrequests
verwendetcomplexjson
, welche verwendetsimplejson
. Seltsam.simplejson
falls verfügbar; Einige Benutzer möchten die neueste simplejson-Version verwenden, anstatt die mit der Python-stdlib gelieferte.simplejson
verwendet das eingebautejson
unter der Haube, gibt aber beschreibendere Fehler. In diesem Falljson
würde die Verwendung nur ein Generikum gebenValueError: No JSON object could be decoded
.u''
Antwort erhalten). SieJSONDecodeError
sagen Ihnen, dass viele Daten erfolgreich analysiert wurden, bevor ein Fehler auftrat. Dies kann daran liegen, dass zu diesem Zeitpunkt ungültige Daten vorhanden sind (fehlerhaftes oder beschädigtes JSON-Dokument) oder dass die Daten abgeschnitten wurden.Überprüfen Sie den Antwortdatenkörper, ob tatsächliche Daten vorhanden sind und ein Datendump gut formatiert zu sein scheint.
In den meisten Fällen Ihre
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Fehler wird durch:Letztendlich sagt Ihnen der Fehler, dass die Zeichenfolge bereits an der ersten Position nicht mit JSON übereinstimmt.
Wenn die Analyse trotz eines Datenkörpers fehlschlägt, der auf den ersten Blick wie JSON aussieht , ersetzen Sie die Anführungszeichen des Datenkörpers:
Hinweis: Anführungszeichen in den Daten müssen ordnungsgemäß maskiert werden
quelle
requests.get(url).json()
Just Works ist der JSON auch nicht fehlerhaft.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
tritt insbesondere auf, wenn eine leere Zeichenfolge an jsonJSONDecodeError: Expecting value: line 1 column 1 (char 0)
tritt auch auf, wenn die erste Zeile in der json-Antwort ungültig ist. Beispielantwort vom Ausführen einesaz cli
Befehls ist["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Dies gab mir den Fehler, der mich hierher führte. Der Rest der Antwort ist ein gültiges JSON-Objekt. Nur diese erste Zeile bricht die Dinge.Mit der
requests
libJSONDecodeError
kann passieren, wenn Sie einen http-Fehlercode wie 404 haben und versuchen, die Antwort als JSON zu analysieren!Sie müssen zuerst nach 200 (OK) suchen oder es bei einem Fehler auslösen lassen, um diesen Fall zu vermeiden. Ich wünschte, es wäre mit einer weniger kryptischen Fehlermeldung fehlgeschlagen.
HINWEIS : Wie Martijn Pieters in den Kommentaren angegeben hat, können Server bei Fehlern mit JSON antworten (dies hängt von der Implementierung ab), sodass die Überprüfung des
Content-Type
Headers zuverlässiger ist.quelle
Ich denke, es ist erwähnenswert, dass in Fällen, in denen Sie den Inhalt einer JSON-Datei selbst analysieren, Sanity Checks hilfreich sein können, um sicherzustellen, dass Sie tatsächlich
json.loads()
den Inhalt der Datei aufrufen , im Gegensatz zum Dateipfad dieses JSON ::Es ist mir ein wenig peinlich zuzugeben, dass dies manchmal passieren kann:
quelle
json.load()
stattdessen verwenden.Überprüfen Sie das Codierungsformat Ihrer Datei und verwenden Sie beim Lesen der Datei das entsprechende Codierungsformat. Es wird Ihr Problem lösen.
quelle
encoding='utf-8'
, also muss man manchmal ein paar Dinge ausprobieren.Dies liegt häufig daran, dass die Zeichenfolge, die Sie analysieren möchten, leer ist:
Sie können Abhilfe schaffen, indem Sie
json_string
vorher prüfen, ob es leer ist:quelle
response.read()
und war dann bestürzt, als ein weiterer Aufruf zuExpecting value: line 1
usw. führte . Die Debug-Anweisung wurde entfernt und das Problem behoben.Es können eingebettete Nullen vorhanden sein, auch nach dem Aufruf von decode (). Verwenden Sie replace ():
quelle
Ich hatte genau dieses Problem mit Anfragen. Vielen Dank an Christophe Roussy für seine Erklärung.
Zum Debuggen habe ich verwendet:
Ich habe eine 404-Antwort von der API erhalten.
quelle
response.status_code
oder vereinfacht werdenprint(response.status_code)
.Ich hatte das gleiche Problem mit Anfragen (die Python-Bibliothek). Es war zufällig der
accept-encoding
Header.Es wurde so eingestellt:
'accept-encoding': 'gzip, deflate, br'
Ich habe es einfach aus der Anfrage entfernt und den Fehler nicht mehr erhalten.
quelle
Für mich wurde in der Anfrage keine Authentifizierung verwendet.
quelle
Für mich war es ein Server, der mit etwas anderem als 200 antwortete, und die Antwort war nicht json-formatiert. Ich habe das vor der JSON-Analyse gemacht:
quelle
Wenn Sie ein Windows-Benutzer sind, kann die Tweepy-API eine leere Zeile zwischen Datenobjekten generieren. Aufgrund dieser Situation kann der Fehler "JSONDecodeError: Erwarteter Wert: Zeile 1, Spalte 1 (Zeichen 0)" angezeigt werden. Um diesen Fehler zu vermeiden, können Sie leere Zeilen löschen.
Beispielsweise:
Referenz: Die Twitter-Stream-API gibt JSONDecodeError ("Expecting value", s, err.value) von None an
quelle
Überprüfen Sie einfach, ob die Anfrage den Statuscode 200 hat. So zum Beispiel:
quelle
Ich habe einen solchen Fehler in der Antwort einer Python-basierten Web-API erhalten
.text
, der mich jedoch hierher geführt hat. Dies kann anderen bei einem ähnlichen Problem helfen (es ist sehr schwierig, Antwort- und Anforderungsprobleme bei einer Suche zu filtern, wennrequests
..).Die Verwendung
json.dumps()
des Anforderungsargumentsdata
zum Erstellen einer korrekt maskierten JSON-Zeichenfolge vor dem POSTing hat das Problem für mich behobenquelle
Ich habe das gleiche Problem festgestellt, als ich die aus einer JSON-Datei geöffnete JSON-Zeichenfolge ausgedruckt habe und festgestellt habe, dass die JSON-Zeichenfolge mit 'ï »¿' beginnt Durch Ändern der Codierung in utf-8-sig wird die Markierung entfernt und json wird problemlos geladen:
quelle