
Rezolvă „Unexpected token” din JSON.parse: ghid practic pentru fiecare cauză
Publicat 23 iul. 2026
SyntaxError: Unexpected token X in JSON at position N este una dintre cele mai frecvente erori din JavaScript și una dintre cele mai puțin utile — îți spune unde a renunțat parserul, nu de ce. Iată cum o rezolvi cu adevărat.
Pasul 1: citește numărul poziției
JSON.parse numără caracterele de la începutul șirului, pornind de la 0. Dacă JSON-ul tău vine dintr-o variabilă, afișează în consolă exact porțiunea din jurul acelei poziții înainte de orice altceva:
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));
}
}
Acest singur fragment rezolvă mai multe astfel de erori decât orice sfat despre sintaxa JSON, pentru că majoritatea erorilor „unexpected token“ sunt de fapt erori de tip „nu știu ce conține de fapt șirul meu“ — spații rămase după un copy-paste, un rând nou în plus dintr-un template literal sau un byte-order-mark (BOM) chiar la început (poziția 0, tokenul , invizibil în majoritatea editoarelor).
Cele 7 cauze, ordonate după cât de des apar în practică
- Virgulă finală.
{"a": 1, "b": 2,}— validă în literalele de obiect din JS, invalidă în JSON. Virgula dinaintea lui}sau]este de departe cea mai frecventă cauză. - Ghilimele simple în loc de duble.
{'a': 1}este JS, nu JSON. JSON cere ghilimele duble atât pentru chei, cât și pentru valorile de tip șir, fără excepții. - Chei fără ghilimele.
{a: 1}— din nou, valid în JS, invalid în JSON. Fiecare cheie are nevoie de ghilimele. - O valoare JS care nu e JSON valid.
undefined,NaN, o funcție sau un comentariu (// like this) — niciuna dintre acestea nu există în specificația JSON, doar în JavaScript. - Codare dublă. Ai apelat
JSON.stringify()de două ori sau parsezi un șir care e deja obiect — verifică cutypeof raw === 'string'înainte de a apela.parse(). - Un șir gol sau un răspuns
undefined. Dacă un fetch a eșuat în tăcere sau a returnat un corp gol,JSON.parse("")aruncăUnexpected end of JSON input, o eroare diferită, dar înrudită — verificăresponse.okși afișează corpul brut înainte de parsare. - BOM sau caractere invizibile din copy-paste. Lipirea unui JSON dintr-un PDF, un document Word sau ieșirea unui terminal poate aduce un BOM sau un spațiu neseparabil care arată identic cu un caracter normal.
Cea mai rapidă soluție: validează înainte să depanezi
Citirea mesajelor de eroare brute, caracter cu caracter, e lentă. Lipește șirul exact într-un formatter care evidențiază direct caracterul invalid, în loc să ghicești după un număr de poziție — transformă „undeva pe lângă caracterul 812“ în „exact această paranteză lipsă, chiar aici“. (Link mai jos.)
Când JSON-ul e cu adevărat valid, dar tot eșuează
Dacă un formatter confirmă că JSON-ul tău e corect sintactic și JSON.parse tot aruncă eroare, șirul pe care îl transmiți nu e șirul pe care crezi că îl transmiți. Cel mai frecvent motiv: apelezi .parse() pe un obiect Response în loc de corpul lui rezolvat.
// 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);
Referință rapidă
| Simptom | Cauză probabilă |
|---|---|
Unexpected token } |
Virgulă finală înaintea acoladei de închidere |
Unexpected token ' |
Ghilimele simple folosite în loc de duble |
Unexpected token a (sau orice literă) |
Cheie de obiect fără ghilimele |
Unexpected end of JSON input |
Șir gol, răspuns trunchiat sau paranteză neînchisă |
Unexpected token (poziția 0) |
Byte-order-mark dintr-un fișier lipit sau salvat pe Windows |
Nimic din toate astea nu cere memorat ceva — soluția e mereu aceiași trei pași: afișează porțiunea din jurul poziției raportate, trece-o printr-un formatter, corectează caracterul pe care ți-l semnalează.