
Fiks "Unexpected token" i JSON.parse: en feltguide til alle årsager
Udgivet 23. jul. 2026
SyntaxError: Unexpected token X in JSON at position N er en af de mest almindelige fejl i JavaScript — og en af de mindst hjælpsomme. Den fortæller dig, hvor parseren gav op, ikke hvorfor. Her er, hvordan du faktisk fikser den.
Trin 1: læs positionstallet
JSON.parse tæller tegn fra strengens start, begyndende ved 0. Hvis din JSON kom fra en variabel, så log det præcise udsnit omkring den position, før du gør noget som helst andet:
try {
JSON.parse(raw);
} catch (e) {
const match = e.message.match(/position (\d+)/);
if (match) {
const pos = Number(match[1]);
console.log(raw.slice(Math.max(0, pos - 20), pos + 20));
}
}
Den ene stump kode løser flere af disse fejl end noget råd om JSON-syntaks, for de fleste “unexpected token”-fejl er i virkeligheden “jeg ved ikke, hvad min streng faktisk indeholder”-fejl — efterstillet whitespace fra en copy-paste, en ekstra linjeskift fra en template literal eller et byte-order-mark (BOM) allerførst (position 0, token , som er usynligt i de fleste editorer).
De 7 årsager, rangeret efter hvor ofte de faktisk optræder
- Efterstillet komma.
{"a": 1, "b": 2,}— gyldigt i JS-objektliteraler, ugyldigt i JSON. Kommaet før}eller]er den suverænt hyppigste årsag. - Enkelte anførselstegn i stedet for dobbelte.
{'a': 1}er JS, ikke JSON. JSON kræver dobbelte anførselstegn om både nøgler og strengværdier, uden undtagelser. - Nøgler uden anførselstegn.
{a: 1}— igen gyldig JS, ugyldig JSON. Hver nøgle skal have anførselstegn. - En JS-værdi, der ikke er gyldig JSON.
undefined,NaN, en funktion eller en kommentar (// like this) — ingen af dem findes i JSON-specifikationen, kun i JavaScript. - Dobbelt-encoding. Du kaldte
JSON.stringify()to gange, eller du parser en streng, der allerede er et objekt — tjek medtypeof raw === 'string', før du kalder.parse(). - En tom streng eller et
undefined-svar. Hvis et fetch fejlede lydløst eller returnerede en tom body, kasterJSON.parse("")Unexpected end of JSON input— en anden, men beslægtet fejl. Tjekresponse.ok, og log den rå body, før du parser. - BOM eller usynlige tegn fra copy-paste. Indsætter du JSON fra en PDF, et Word-dokument eller noget terminaloutput, kan det bære et BOM eller et hårdt mellemrum med sig, der ligner et normalt tegn til forveksling.
Den hurtigste løsning: validér, før du debugger
At læse rå fejlmeddelelser tegn for tegn er langsomt. Indsæt den præcise streng i en formatter, der fremhæver det ugyldige tegn direkte, i stedet for at gætte ud fra et positionstal — det forvandler “et sted omkring tegn 812” til “denne konkrete manglende parentes, lige her.” (Link nedenfor.)
Når din JSON faktisk er gyldig, men stadig fejler
Hvis en formatter bekræfter, at din JSON er syntaktisk korrekt, og JSON.parse stadig kaster en fejl, er den streng, du sender ind, ikke den streng, du tror. Den hyppigste grund: du kalder .parse() på et Response-objekt i stedet for dets afviklede body.
// Wrong — parses "[object Response]", not the body
const data = JSON.parse(await fetch(url));
// Right
const data = await (await fetch(url)).json();
// or, if you need the raw text first:
const text = await (await fetch(url)).text();
const data = JSON.parse(text);
Hurtig oversigt
| Symptom | Sandsynlig årsag |
|---|---|
Unexpected token } |
Efterstillet komma før den afsluttende tuborgklamme |
Unexpected token ' |
Enkelte anførselstegn brugt i stedet for dobbelte |
Unexpected token a (eller et vilkårligt bogstav) |
Objektnøgle uden anførselstegn |
Unexpected end of JSON input |
Tom streng, afkortet svar eller ulukket parentes |
Unexpected token (position 0) |
Byte-order-mark fra en kopieret eller Windows-gemt fil |
Intet af dette kræver udenadslære — løsningen er altid de samme tre trin: log udsnittet omkring den rapporterede position, kør det gennem en formatter, ret det ene tegn, den udpeger.