„Unexpected end of JSON input“: Was fehlt und wie du es findest
„Unexpected end of JSON input“ bedeutet: Der Parser war noch mitten in der Arbeit, als der Text zu Ende war. Entweder war gar nichts da, oder es fehlt ein Stück am Ende – eine schließende Klammer, ein Anführungszeichen, der Rest einer Datei.
So sieht die Meldung aus
| Umgebung | Leere Eingabe | Abgeschnittenes JSON, z. B. {"a":1 |
|---|---|---|
| Chrome, Edge, Node.js | Unexpected end of JSON input |
Expected ',' or '}' after property value in JSON at position 6 |
| Firefox | JSON.parse: unexpected end of data at line 1 column 1 of the JSON data |
JSON.parse: end of data after property value in object |
| Safari | JSON Parse error: Unexpected EOF |
JSON Parse error: Expected '}' |
Python (json.loads) |
Expecting value: line 1 column 1 (char 0) |
Expecting ',' delimiter: line 1 column 7 (char 6) |
Bei fetch() steht die Meldung oft in einer längeren Fassung, etwa Failed to execute 'json' on 'Response': Unexpected end of JSON input. Gemeint ist dasselbe.
Die Meldung ganz ohne Positionsangabe ist dabei ein wichtiger Hinweis: Dann war der Text meistens komplett leer.
Ursache 1: Die Antwort des Servers ist leer
Das ist mit Abstand der häufigste Fall. Dein Code ruft response.json() auf, aber der Server hat keinen Inhalt geschickt:
- Status 204 No Content, zum Beispiel nach einem erfolgreichen
DELETEoderPUT. - Eine Fehlerantwort (etwa 401 oder 500) ohne Inhalt.
- Eine Weiterleitung oder ein Abbruch, der beim Client als leere Antwort ankommt.
Prüfe deshalb erst den Status und lies den Inhalt als Text, bevor du ihn parst:
const response = await fetch('/api/kunden/42', { method: 'DELETE' });
if (!response.ok) {
throw new Error(`Server antwortet mit ${response.status}`);
}
const text = await response.text();
const daten = text === '' ? null : JSON.parse(text);
So funktioniert derselbe Code für Antworten mit und ohne Inhalt.
Ein Sonderfall sind fetch()-Aufrufe mit mode: 'no-cors' an eine fremde Domain: Die Antwort ist dann „opaque“, ihr Inhalt für JavaScript nicht lesbar, und response.json() scheitert genau mit dieser Meldung. Das löst kein Parser, sondern nur ein Server, der die Anfrage per CORS erlaubt.
Ursache 2: Ein leerer Text wird geparst
Auch ohne Netzwerk kommt die Meldung vor, sobald JSON.parse('') aufgerufen wird. Typische Quellen sind ein leeres Eingabefeld, eine leere Umgebungsvariable oder eine leere Datei:
const config = JSON.parse(process.env.APP_CONFIG ?? '');
Fehlt die Variable, wird ein leerer Text geparst. Besser ist ein sinnvoller Standardwert, zum Beispiel process.env.APP_CONFIG ?? '{}', oder eine eigene Fehlermeldung, die sagt, was fehlt.
Kein Fehler entsteht dagegen bei JSON.parse(null): JavaScript macht daraus den Text "null", und das ist gültiges JSON. Deshalb liefert JSON.parse(localStorage.getItem('x')) für einen fehlenden Eintrag einfach null.
Ursache 3: Die Daten sind abgeschnitten
Endet das JSON mitten in einem Objekt, wurde es unterwegs gekürzt. Typische Gründe:
- Ein Download oder Upload wurde abgebrochen.
- Ein Programm hat die Ausgabe auf eine Höchstlänge gekürzt, etwa beim Loggen.
- Beim Streaming wird jedes Stück einzeln geparst statt der vollständigen Antwort.
- Beim Kopieren aus einem Terminal oder einer Konsole fehlte das Ende.
So erkennst du es: Formatiere den Text im JSON-Formatierer. Die Fehlermeldung steht dann in der letzten Zeile, und die Einrückung zeigt, wie viele Objekte und Listen noch offen sind. Fehlt nur eine Klammer, kannst du sie ergänzen. Fehlen Daten, hilft nur, sie vollständig neu zu laden.
Ursache 4: Eine Klammer oder ein Anführungszeichen fehlt
Wurde das JSON von Hand geschrieben, fehlt oft einfach ein Zeichen:
{
"name": "Ada",
"sprachen": ["de", "en"
}
Hier fehlt ] hinter "en". Chrome meldet in diesem Fall Expected ',' or ']' after array element an der Position von } – denn erst dort merkt der Parser, dass die Liste nicht geschlossen wurde. Korrekt ist:
{
"name": "Ada",
"sprachen": ["de", "en"]
}
Jede { braucht eine }, jede [ eine ]. Gute Editoren markieren das passende Gegenstück, wenn der Cursor auf einer Klammer steht.
Text ohne schließendes Anführungszeichen
{ "name": "Ada, "aktiv": true }
Nach Ada fehlt das schließende ". Der Parser liest dann alles Folgende als Teil des Textes. Hier endet der Text am nächsten " (vor aktiv), und der Fehler zeigt sich erst danach. Fehlt das letzte Anführungszeichen einer Datei, läuft der Text bis zum Ende: Chrome meldet Unterminated string in JSON, Safari ebenfalls Unterminated string, Python Unterminated string starting at mit der Position, an der der Text beginnt.
Ein echter Zeilenumbruch in einem Text ist übrigens nicht erlaubt; schreibe ihn als \n. Mehr zu Sonderzeichen steht im Ratgeber JSON-Fehler finden und beheben.
Kurz zusammengefasst
- Meldung ohne Position: Der Text war leer. Prüfe Server-Antwort, Datei oder Variable.
- Meldung mit Position am Ende: Es fehlt etwas. Zähle Klammern und Anführungszeichen oder lade die Daten vollständig neu.
- Bei
fetch(): erstresponse.okund den Status prüfen, dann parsen.