
Fixa "Unexpected token" i JSON.parse: en fältguide till varje orsak
Publicerad 23 juli 2026
SyntaxError: Unexpected token X in JSON at position N är ett av de vanligaste felen i JavaScript, och ett av de minst hjälpsamma — det talar om var parsern gav upp, inte varför. Så här fixar du det på riktigt.
Steg 1: läs positionsnumret
JSON.parse räknar tecken från strängens början, med start på 0. Om din JSON kom från en variabel, logga det exakta utsnittet runt den positionen innan du gör något annat:
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));
}
}
Det där lilla kodavsnittet löser fler av de här felen än något råd om JSON-syntax, eftersom de flesta “unexpected token”-fel egentligen är “jag vet inte vad min sträng faktiskt innehåller”-fel — avslutande blanksteg från en kopiera-klistra, en extra radbrytning från en template literal, eller ett byte-order-mark (BOM) allra först (position 0, token , som är osynligt i de flesta redigerare).
De 7 orsakerna, rankade efter hur ofta de faktiskt inträffar
- Avslutande kommatecken.
{"a": 1, "b": 2,}— giltigt i JS-objektliteraler, ogiltigt i JSON. Kommatecknet före}eller]är den enskilt vanligaste orsaken. - Enkla citattecken i stället för dubbla.
{'a': 1}är JS, inte JSON. JSON kräver dubbla citattecken runt både nycklar och strängvärden, utan undantag. - Nycklar utan citattecken.
{a: 1}— återigen giltig JS, ogiltig JSON. Varje nyckel behöver citattecken. - Ett JS-värde som inte är giltig JSON.
undefined,NaN, en funktion eller en kommentar (// like this) — inget av detta finns i JSON-specifikationen, bara i JavaScript. - Dubbel kodning. Du anropade
JSON.stringify()två gånger, eller så parsar du en sträng som redan är ett objekt — kontrollera medtypeof raw === 'string'innan du anropar.parse(). - En tom sträng eller ett
undefined-svar. Om en fetch misslyckades tyst eller returnerade en tom body kastarJSON.parse("")feletUnexpected end of JSON input, ett annat men besläktat fel — kontrolleraresponse.okoch logga den råa bodyn innan du parsar. - BOM eller osynliga tecken från kopiera-klistra. Att klistra in JSON från en PDF, ett Word-dokument eller viss terminalutdata kan följa med ett BOM eller ett hårt mellanslag som ser identiskt ut med ett vanligt tecken.
Den snabbaste fixen: validera innan du felsöker
Att läsa råa felmeddelanden tecken för tecken är långsamt. Klistra in den exakta strängen i en formatterare som markerar det ogiltiga tecknet direkt i stället för att gissa utifrån ett positionsnummer — det förvandlar “någonstans nära tecken 812” till “just den här saknade hakparentesen, precis här.” (Länkad nedan.)
När JSON:en faktiskt är giltig men ändå misslyckas
Om en formatterare bekräftar att din JSON är syntaktiskt korrekt och JSON.parse ändå kastar fel, är strängen du skickar in inte den sträng du tror. Den vanligaste orsaken: du anropar .parse() på ett Response-objekt i stället för dess upplösta 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);
Snabbreferens
| Symptom | Trolig orsak |
|---|---|
Unexpected token } |
Avslutande kommatecken före den stängande klammern |
Unexpected token ' |
Enkla citattecken använda i stället för dubbla |
Unexpected token a (eller valfri bokstav) |
Objektnyckel utan citattecken |
Unexpected end of JSON input |
Tom sträng, avhugget svar eller ostängd parentes |
Unexpected token (position 0) |
Byte-order-mark från en kopierad eller Windows-sparad fil |
Inget av detta kräver att du memorerar något — fixen är alltid samma tre steg: logga utsnittet runt den rapporterade positionen, kör det genom en formatterare, fixa det enda tecken den flaggar.