Tech Help

De ce JSON.parse spune "Unexpected token"?

JSON.parse aruncă Unexpected token când textul nu e JSON valid. Depanați ghilimele simple, virgule finale, răspunsuri HTML și poziția erorii.

Răspuns rapid

JSON.parse() aruncă SyntaxError când intrarea nu e JSON valid. «Unexpected token» înseamnă de obicei că analizorul a ajuns la un caracter nepermis în acel punct al structurii.

Cauze obișnuite: ghilimele simple, virgule finale, nume de proprietăți fără ghilimele, escape greșit de șir, text în plus în jurul JSON, sau analizarea HTML ori a altui corp non-JSON ca și cum ar fi JSON.

Formularea exactă a erorii variază după motorul JavaScript și browser. Nu presupuneți că fiecare runtime afișează «Unexpected token X in JSON at position N».

Acesta e diagnosticul Unexpected token la JSON.parse: ce înseamnă eroarea, cum citiți poziția și ce faceți când corpul e HTML. Acoperirea mai largă a virgulei finale, ghilimelelor și Unexpected end e în Erori JSON obișnuite: virgulă finală, ghilimele și Unexpected token.

Ce înseamnă “Unexpected token” în JSON.parse()?

JSON.parse() cere gramatica JSON. Un caracter ilegal la poziția curentă aruncă SyntaxError. {“name”:“Alex”,} e invalid: după acea virgulă obiectul nu se poate închide. Textul mesajului și poziția variază în continuare după runtime.

Ce eroare aruncă JSON.parse()?

JSON invalid aruncă în general SyntaxError. Înregistrați error.name ca să confirmați tipul. Nu hardcodați tot error.message: motoarele și versiunile îl formulează diferit.

try {
  JSON.parse('{"name":"Alex",}');
} catch (error) {
  console.log(error.name);
  // SyntaxError
}

1. Folosirea ghilimelelor simple în loc de duble

{‘name’:‘Alex’} e JSON invalid. {“name”:“Alex”} e valid. Șirurile JSON și numele membrilor de obiect folosesc ghilimele duble. Un literal de obiect JavaScript ca const user = { name: ‘Alex’ } poate fi JavaScript legal și totuși să nu fie text JSON.

Invalid

{'name':'Alex'}

Valid

{"name":"Alex"}

2. Virgule finale

O virgulă după ultima proprietate sau ultimul element de tablou nu e JSON standard valid. {“name”:“Alex”,“age”:30,} și [1, 2, 3,] eșuează ambele. Tratați-o ca o cauză de Unexpected token; Erori JSON obișnuite: virgulă finală, ghilimele și Unexpected token acoperă virgulele finale mai în detaliu.

Invalid

{
  "name": "Alex",
  "age": 30,
}

Valid

{
  "name": "Alex",
  "age": 30
}
[1, 2, 3,]

3. Nume de proprietăți fără ghilimele

{ name: “Alex” } poate fi un literal de obiect JavaScript. În JSON, numele membrilor de obiect sunt șiruri și au nevoie de ghilimele duble: {“name”:“Alex”}.

Invalid

{
  name: "Alex"
}

Valid

{
  "name": "Alex"
}

4. Escape invalid de șir

În textul JSON o bară oblică inversă începe un escape. O cale brută ca C:\Users\Alex e invalidă pentru că \U nu e un escape legal. Dublăți barele oblice inverse. Nu amestecați escape-ul limbajului gazdă cu escape-ul JSON. Erori JSON obișnuite: virgulă finală, ghilimele și Unexpected token acoperă asta mai în detaliu.

Invalid

{"file":"C:\Users\Alex"}

Valid

{"file":"C:\\Users\\Alex"}

5. Text în plus înainte sau după JSON

JSON.parse așteaptă o singură valoare JSON. Un prefix ca Success: înainte de {“ok”:true}, sau un sufix ca done după, face tot șirul invalid. Spațiul alb nesemnificativ în jurul unei singure valori JSON e permis. JSON nu interzice spații înainte sau după valoare.

Success:
{"ok":true}
{"ok":true}
done

6. Analizarea HTML în loc de JSON

Apelul response.json() pe o pagină HTML e un caz obișnuit de Unexpected token. Endpointuri greșite, pagini HTML 404 sau 500, redirecționări de autentificare, corpuri de proxy și pagini de rezervă încep adesea cu marcaj. «Unexpected token < înseamnă întotdeauna HTML» e prea puternic: < e un indiciu, nu o dovadă.

fetch('/api/data')
  .then(response => response.json())

Ce înseamnă de obicei “Unexpected token <”?

Valorile JSON nu încep de obicei cu <. Dacă corpul începe cu sau , < poate fi primul caracter ilegal. La depanarea locală, verificați statusul HTTP, Content-Type și corpul brut. Formularea motorului variază în continuare.

Verificați răspunsul înainte de a-l analiza

Corpul fetch poate fi consumat o singură dată. La depanarea locală, citiți mai întâi text(), inspectați un prefix scurt, apoi JSON.parse pe același șir. Nu apelați response.json() și apoi response.text() pe același răspuns. Nu înregistrați implicit încărcături de producție sensibile.

const response = await fetch(url);
const text = await response.text();

console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));

try {
  const data = JSON.parse(text);
  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error);
}

Ce înseamnă “at position 123”?

Unele motoare raportează o poziție, linie sau coloană. Căutați în apropiere o ghilimea, virgulă, acoladă sau escape greșite. Indexul e locul unde analizarea a observat o problemă; cauza reală poate fi mai devreme. Nu e garantat că e exact caracterul defect.

Unexpected token versus Unexpected end

Unexpected token înseamnă că analizorul a întâlnit un caracter pe care nu-l aștepta. Unexpected end poate apărea când intrarea se oprește înainte ca valoarea să fie completă, ca în {“name”:“Alex” fără acolada de închidere. Formularea exactă depinde de motor. Erori JSON obișnuite: virgulă finală, ghilimele și Unexpected token acoperă JSON incomplet mai pe larg.

{"name":"Alex"

JSON nu e același lucru cu un literal de obiect JavaScript

JSON e un format de date. Un literal de obiect JavaScript e sintaxă JavaScript. Obiectul JS cu chei fără ghilimele, ghilimele simple și virgulă finală nu e text JSON valid. JSON.parse nu poate analiza în siguranță literale de obiect JavaScript.

const data = {
  name: 'Alex',
  active: true,
};
{
  "name": "Alex",
  "active": true
}

Poate JSON să conțină comentarii?

JSON standard nu suportă comentarii. O linie // în interiorul unui obiect e invalidă. JSON5 și extensiile similare sunt formate diferite. Formatare și comparare JSON validează JSON standard cu JSON.parse și nu tratează JSON5 ca JSON.

{
  // user name
  "name": "Alex"
}

Sunt undefined, NaN și Infinity JSON valid?

Nu. Valorile JSON sunt obiect, tablou, șir, număr, true, false și null. undefined, NaN și Infinity nu sunt. O valoare de nivel superior nu trebuie să fie obiect sau tablou: true, 123, “hello” și null sunt JSON valid.

{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null

Cum să corectați o eroare Unexpected token pas cu pas

Lucrați sursa, nu șirul erorii:

  1. Confirmați că intrarea e într-adevăr JSON, nu HTML, jurnale sau JavaScript.
  2. Inspectați primele caractere ale intrării brute.
  3. Dacă a venit de la un API, verificați statusul HTTP și Content-Type. Nici 200, nici application/json nu garantează JSON valid.
  4. Validați sintaxa într-un analizor JSON.
  5. Folosiți orice poziție, linie sau coloană raportată ca indiciu, nu ca rădăcina garantată a problemei.
  6. Verificați ghilimelele, virgulele, acoladele, parantezele drepte și escape-urile lângă acea zonă.
  7. Comparați cu o copie formatată și validată.
  8. Corectați serializatorul sau endpointul. Nu ștergeți tokenul raportat la întâmplare.
Nu «reparați» JSON înlocuind ghilimelele la întâmplare

O înlocuire globală a ' cu " poate strica apostrofurile din șiruri, textul deja escapat și sursele care nu sunt JSON. Produceți JSON valid din serializatorul real. Nu tratați eval ca un analizor JSON.

Folosiți JSON.stringify() când produceți JSON în JavaScript

Preferăți JSON.stringify în loc să concatenați șiruri de mână. Emite text JSON valid pentru valorile pe care le serializează. Nu păstrează fiecare valoare JavaScript: undefined, funcțiile și simbolurile au un comportament special. Detaliul ăsta e în afara domeniului aici.

const data = {
  name: "Alex",
  active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}

JSON invalid versus o corecție reală

Aceste perechi au fost verificate cu JSON.parse. Pentru HTML, corecția e răspunsul, nu o editare de sintaxă.

Problemă Invalid Corecție
Ghilimele simple {'a':1} {"a":1}
Virgulă finală {"a":1,} {"a":1}
Cheie fără ghilimele {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Corp HTML <html>... Verificați endpointul și răspunsul brut. Nu editați HTML ca să devină JSON.

Un ghid simplu de decizie pentru Unexpected token

Dacă JSON.parse a eșuat, decideți dacă aveți deloc JSON înainte să rescrieți ghilimelele.

  • JSON.parse a eșuat
  • De la un API? Verificați statusul, Content-Type și corpul brut
  • Începe ca JSON? Dacă nu, corectați sursa sau endpointul
  • Dacă da, validați ghilimele, virgule, acolade, paranteze drepte, escape-uri, valori nesuportate
  • Folosiți poziția raportată ca indiciu
  • Corectați sursa, apoi analizați din nou
Unexpected token numește surpriza. Sursa textului e adesea corecția reală.

Validați JSON înainte de a-l analiza sau folosi

NEXNARA Formatare și comparare JSON validează JSON în browser cu JSON.parse—nu eval.

Validare, formatare frumoasă cu 2 spații, 4 spații sau taburi, minify, copiere, descărcare și încărcare .json. JSON Diff acoperă obiecte și tablouri imbricate, căi, rezumat, filtre și interschimbare. După analiză, copiile formatată frumos și minify ale acelorași date se compară ca egale; cheile de obiect se compară după nume.

Textul mai mare de 5 MB poate părea lent. Textul mai mare de 15 MB nu e procesat în browser.

Validarea și formatarea JSON se întâmplă în browserul dvs. Acest instrument nu trimite JSON către un server NEXNARA. Reclamele și alte funcții ale site-ului folosesc totuși rețeaua.

Lipiți șirul care eșuează în Formatare și comparare JSON și citiți primele caractere înainte să rescrieți ghilimelele.

FAQ

De ce JSON.parse spune Unexpected token?

Textul nu e JSON valid în punctul în care s-a oprit analizorul. Cauze tipice: ghilimele, virgule, text în plus sau un corp non-JSON, cum ar fi HTML.

Ce înseamnă Unexpected token < in JSON?

Primul caracter ilegal poate fi <. Asta indică adesea o pagină HTML, dar nu e dovadă de 404 nici de HTML în fiecare caz. Verificați statusul, Content-Type și corpul brut.

Cum găsesc poziția erorii în JSON?

Dacă motorul raportează o poziție, linie sau coloană, uitați-vă în apropiere. Greșeala reală poate fi mai devreme. Folosiți-o ca indiciu, apoi validați.

Poate JSON să folosească ghilimele simple?

Nu. În JSON standard, șirurile și numele de membri folosesc ghilimele duble.

Poate JSON să aibă virgule finale?

Nu. JSON standard nu permite o virgulă după ultima proprietate sau ultimul element de tablou.

Cum verific dacă un șir e JSON valid?

Apelați JSON.parse într-un try/catch, sau lipiți textul în Formatare și comparare JSON. Dacă analizarea aruncă SyntaxError, șirul nu e JSON valid.