Expecting value: line 1 column 1 (char 0)
Python sagt Ihnen, dass das allererste Zeichen dessen, was Sie übergeben haben, nicht der Anfang eines JSON-Werts ist. In der Praxis heißt das fast nie, dass Ihr JSON subtil fehlerhaft ist. Es heißt, dass das Geparste gar kein JSON ist: eine HTML-Fehlerseite, ein leerer Körper, eine Klartextmeldung oder überhaupt nichts. Die Position ist Zeile 1 Spalte 1, weil der Parser scheiterte, bevor er irgendetwas gelesen hatte.
Sie sehen das vielleicht auch so geschrieben
- json.decoder.JSONDecodeError: Expecting value
V8 hat 2022 die meisten seiner JSON-Fehlermeldungen neu formuliert. Die ältere Formulierung ist noch immer das, was die meisten Suchergebnisse zeigen, aber keine aktuelle Laufzeitumgebung gibt sie aus.
Fügen Sie Ihr JSON ein und sehen Sie genau, wo es bricht
Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen
Was es tatsächlich auslöst
Sortiert danach, wie oft sich das jeweilige als die Antwort herausstellt.
-
01 Der Antwortkörper ist HTML, nicht JSON
Eine 404-Seite, eine Weiterleitung zum Login, ein Cloudflare-Challenge oder eine Proxy-Fehlerseite. Die Anfrage war auf HTTP-Ebene erfolgreich und lieferte ein Dokument, nur eben nicht das erwartete. Geben Sie vor dem Parsen die ersten paar hundert Zeichen aus, und Sie sehen es sofort.
Geht kaputt
r = requests.get(url) data = r.json() # JSONDecodeErrorFunktioniert
r = requests.get(url) if r.status_code != 200 or 'json' not in r.headers.get('content-type', ''): raise RuntimeError(f"{r.status_code} {r.headers.get('content-type')}: {r.text[:300]}") data = r.json() -
02 Der Körper ist leer
Ein HTTP 204, eine durch Rate Limiting abgewiesene Anfrage, die nichts zurückgab, eine WAF, die den Körper verworfen hat, oder eine Datei, die existiert, aber null Bytes hat. Eine leere Zeichenkette ist kein gültiges JSON. Die kürzesten gültigen Dokumente sind null, 0, "", [] und {}.
Geht kaputt
json.loads("")Funktioniert
text = r.text if not text.strip(): return None data = json.loads(text) -
03 Sie lesen eine Datei, die kein JSON ist
Eine CSV, eine Logdatei, ein Python-Pickle oder eine JSON-Lines-Datei, in der jede Zeile ein eigenes Dokument ist. Für JSON Lines parsen Sie Zeile für Zeile statt alles auf einmal.
Geht kaputt
with open('events.jsonl') as f: data = json.load(f) # Expecting value, or Extra dataFunktioniert
with open('events.jsonl') as f: data = [json.loads(line) for line in f if line.strip()] -
04 Die Authentifizierung schlug fehl und die API antwortete mit Klartext
Viele APIs geben „Unauthorized“ oder „Forbidden“ als reinen Text mit 401 oder 403 zurück, nicht als JSON. Prüfen Sie den Statuscode, bevor Sie den Körper prüfen.
Derselbe Fehler in anderen Laufzeitumgebungen
Das zugrunde liegende Problem ist identisch; nur der Wortlaut unterscheidet sich. Meldet eine Kollegin eine dieser Zeilen, sieht sie genau dasselbe wie Sie.
| JavaScript (V8) | Unexpected token '<', "<!DOCTYPE "... is not valid JSON |
|---|---|
| JavaScript (V8), empty input | Unexpected end of JSON input |
| C# (Newtonsoft) | Unexpected character encountered while parsing value: <. Path '', line 0, position 0. |
Häufige Fragen
- Warum steht da immer Zeile 1 Spalte 1?
- Weil der Parser am allerersten Zeichen scheiterte. Er kam nie weit genug, um Zeile 2 zu erreichen. Nennt Ihr Fehler eine spätere Zeile und Spalte, liegt das Problem wirklich in Ihrem JSON und es ist ein anderer Fehler.
- Wie sehe ich, was ich tatsächlich bekommen habe?
- Geben Sie response.text[:500] aus, bevor Sie .json() aufrufen. In neun von zehn Fällen steht die Antwort schon in der ersten Zeile: ein <!DOCTYPE html>, eine leere Zeichenkette oder eine kurze Klartextmeldung.
- Nimmt json.loads ein bytes-Objekt entgegen?
- Ja, seit Python 3.6 akzeptiert json.loads neben str auch bytes und bytearray und erkennt UTF-8, UTF-16 und UTF-32. Dieser Fehler kommt also nicht daher, dass Sie bytes übergeben.
Jetzt beheben
Fügen Sie das Payload in das Werkzeug oben ein, oder gehen Sie direkt zu dem, das für diesen Zweck gebaut wurde.
Validieren Sie Ihr JSON