CodeKitHub
Paranda "Unexpected token" JSON.parse'is: välijuhend iga põhjuse kohta

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

  1. 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.
  2. Ü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.
  3. Jutumärkideta võtmed. {a: 1} — jällegi kehtiv JS, kehtetu JSON. Iga võti vajab jutumärke.
  4. JS-väärtus, mis pole kehtiv JSON. undefined, NaN, funktsioon või kommentaar (// like this) — ühtegi neist JSON-i spetsifikatsioonis pole, ainult JavaScriptis.
  5. Topeltkodeerimine. Kutsusid JSON.stringify() kaks korda või parsid stringi, mis on juba objekt — kontrolli enne .parse() kutsumist typeof raw === 'string' abil.
  6. Tühi string või undefined vastus. Kui fetch ebaõnnestus vaikselt või tagastas tühja keha, viskab JSON.parse("") vea Unexpected end of JSON input — erineva, kuid seotud vea. Kontrolli response.ok ja logi toorkeha enne parsimist.
  7. 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.

← Tagasi blogisse