
Fiks "Unexpected token" i JSON.parse: en feltguide til alle årsakene
Publisert 23. juli 2026
SyntaxError: Unexpected token X in JSON at position N er en av de vanligste feilene i JavaScript, og en av de minst nyttige — den forteller deg hvor parseren ga opp, ikke hvorfor. Her er hvordan du faktisk fikser den.
Steg 1: les posisjonstallet
JSON.parse teller tegn fra starten av strengen, med start på 0. Hvis JSON-en din kom fra en variabel, logg det nøyaktige utsnittet rundt den posisjonen før du gjør noe annet:
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 kodesnutten løser flere av disse feilene enn noe råd om JSON-syntaks, fordi de fleste «unexpected token»-feil egentlig er «jeg vet ikke hva strengen min faktisk inneholder»-feil — mellomrom på slutten fra en kopier-og-lim, et ekstra linjeskift fra en template literal, eller et byte-order-mark (BOM) helt i starten (posisjon 0, token , som er usynlig i de fleste editorer).
De 7 årsakene, rangert etter hvor ofte de faktisk skjer
- Komma på slutten.
{"a": 1, "b": 2,}— gyldig i JS-objektliteraler, ugyldig i JSON. Kommaet før}eller]er den aller vanligste årsaken. - Enkle anførselstegn i stedet for doble.
{'a': 1}er JS, ikke JSON. JSON krever doble anførselstegn rundt både nøkler og strengverdier, uten unntak. - Nøkler uten anførselstegn.
{a: 1}— igjen, gyldig JS, ugyldig JSON. Hver nøkkel trenger anførselstegn. - En JS-verdi som ikke er gyldig JSON.
undefined,NaN, en funksjon, eller en kommentar (// like this) — ingen av disse finnes i JSON-spesifikasjonen, bare i JavaScript. - Dobbel koding. Du kalte
JSON.stringify()to ganger, eller du parser en streng som allerede er et objekt — sjekk medtypeof raw === 'string'før du kaller.parse(). - En tom streng eller
undefined-respons. Hvis et fetch-kall feilet stille eller returnerte en tom body, kasterJSON.parse("")Unexpected end of JSON input, en annen, men beslektet feil — sjekkresponse.okog logg den rå body-en før du parser. - BOM eller usynlige tegn fra kopier-og-lim. Å lime inn JSON fra en PDF, et Word-dokument eller terminalutskrift kan dra med seg et BOM eller et hardt mellomrom som ser identisk ut med et vanlig tegn.
Den raskeste fiksen: valider før du feilsøker
Å lese rå feilmeldinger tegn for tegn er tregt. Lim den nøyaktige strengen inn i en formatterer som fremhever det ugyldige tegnet direkte i stedet for å gjette ut fra et posisjonstall — det gjør «et sted rundt tegn 812» om til «akkurat denne manglende klammen, her.» (Lenket nedenfor.)
Når JSON-en faktisk er gyldig, men likevel feiler
Hvis en formatterer bekrefter at JSON-en din er syntaktisk korrekt og JSON.parse fortsatt kaster feil, er strengen du sender inn ikke den strengen du tror den er. Den vanligste grunnen: du kaller .parse() på et Response-objekt i stedet for dets ferdiglastede 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);
Hurtigreferanse
| Symptom | Sannsynlig årsak |
|---|---|
Unexpected token } |
Komma rett før den avsluttende klammen |
Unexpected token ' |
Enkle anførselstegn brukt i stedet for doble |
Unexpected token a (eller en annen bokstav) |
Objektnøkkel uten anførselstegn |
Unexpected end of JSON input |
Tom streng, avkuttet respons, eller ulukket klamme |
Unexpected token (posisjon 0) |
Byte-order-mark fra en kopiert eller Windows-lagret fil |
Ingenting av dette krever at du pugger noe — fiksen er alltid de samme tre stegene: logg utsnittet rundt den rapporterte posisjonen, kjør det gjennom en formatterer, fiks det ene tegnet den flagger.