Zum Inhalt springen
jsonbeautifiers
Deutsch
Python Überprüft durch Ausführen des Parsers auf CPython 3.14.3.

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

Eingabe

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.

  1. 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()   # JSONDecodeError

    Funktioniert

    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()
  2. 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)
  3. 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 data

    Funktioniert

    with open('events.jsonl') as f:
        data = [json.loads(line) for line in f if line.strip()]
  4. 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