
Paranda "Unexpected token" JSON.parse'is: välijuhend iga põhjuse kohta
Avaldatud 23. juuli 2026
SyntaxError: Unexpected token X in JSON at position N on JavaScripti üks levinumaid vigu ja üks kõige vähem abistavaid — see ütleb, kus parser alla andis, mitte miks. Siin on, kuidas see tegelikult parandada.
1. samm: loe positsiooninumbrit
JSON.parse loeb märke stringi algusest, alustades nullist. Kui su JSON tuli muutujast, logi enne kõike muud täpne lõik selle positsiooni ümbert:
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));
}
}
See üks koodijupp lahendab neist vigadest rohkem kui ükski nõuanne JSON-i süntaksi kohta, sest enamik “unexpected token” vigu on tegelikult “ma ei tea, mida mu string päriselt sisaldab” vead — kopeerimisest jäänud lõputühik, lisareavahetus template literal’ist või baidijärjemärk (BOM) kohe alguses (positsioon 0, token , mis on enamikus redaktorites nähtamatu).
7 põhjust, järjestatud selle järgi, kui tihti need päriselt esinevad
- Lõpukomaga rida.
{"a": 1, "b": 2,}— kehtiv JS-i objektiliteraalis, kehtetu JSON-is. Koma enne}või]on kõige levinum põhjus üldse. - Ühekordsed jutumärgid topeltjutumärkide asemel.
{'a': 1}on JS, mitte JSON. JSON nõuab topeltjutumärke nii võtmete kui ka stringiväärtuste ümber, eranditeta. - Jutumärkideta võtmed.
{a: 1}— jällegi kehtiv JS, kehtetu JSON. Iga võti vajab jutumärke. - JS-väärtus, mis pole kehtiv JSON.
undefined,NaN, funktsioon või kommentaar (// like this) — ühtegi neist JSON-i spetsifikatsioonis pole, ainult JavaScriptis. - Topeltkodeerimine. Kutsusid
JSON.stringify()kaks korda või parsid stringi, mis on juba objekt — kontrolli enne.parse()kutsumisttypeof raw === 'string'abil. - Tühi string või
undefinedvastus. Kui fetch ebaõnnestus vaikselt või tagastas tühja keha, viskabJSON.parse("")veaUnexpected end of JSON input— erineva, kuid seotud vea. Kontrolliresponse.okja logi toorkeha enne parsimist. - BOM või nähtamatud märgid kopeerimisest. JSON-i kleepimine PDF-ist, Wordi dokumendist või mõnest terminaliväljundist võib kaasa tuua BOM-i või sisetühiku, mis näeb tavalisest märgist identne välja.
Kiireim lahendus: valideeri enne silumist
Toorete veateadete märkhaaval lugemine on aeglane. Kleebi täpne string vormindajasse, mis tõstab kehtetu märgi otse esile, selle asemel et positsiooninumbrist arvata — see muudab “kuskil märgi 812 lähedal” kujule “just see konkreetne puuduv sulg, siinsamas”. (Link allpool.)
Kui JSON on tõesti kehtiv, aga ikka ebaõnnestub
Kui vormindaja kinnitab, et su JSON on süntaktiliselt korrektne, aga JSON.parse viskab ikka vea, siis string, mille sisse annad, pole see string, mida arvad. Kõige levinum põhjus: kutsud .parse() Response objektil, mitte selle lahendatud kehal.
// 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);
Kiirviide
| Sümptom | Tõenäoline põhjus |
|---|---|
Unexpected token } |
Lõpukomaga rida enne sulgevat loogsulgu |
Unexpected token ' |
Ühekordsed jutumärgid topeltjutumärkide asemel |
Unexpected token a (või mis tahes täht) |
Jutumärkideta objektivõti |
Unexpected end of JSON input |
Tühi string, katkenud vastus või sulgemata sulg |
Unexpected token (positsioon 0) |
Baidijärjemärk kopeeritud või Windowsis salvestatud failist |
Midagi neist ei pea pähe õppima — lahendus on alati samad kolm sammu: logi lõik teatatud positsiooni ümbert, lase see läbi vormindaja, paranda see üks märk, mille see esile tõstab.