Tech Help

Zašto JSON.parse kaže "Unexpected token"?

JSON.parse baca Unexpected token kada tekst nije važeći JSON. Otklonite jednostruke navodnike, završne zareze, HTML odgovore i poziciju greške.

Brzi odgovor

JSON.parse() baca SyntaxError kada ulaz nije važeći JSON. „Unexpected token“ obično znači da je parser stigao do znaka koji na tom mestu u strukturi nije dozvoljen.

Česti uzroci su jednostruki navodnici, završni zarezi, imena svojstava bez navodnika, loš escape niske, dodatni tekst oko JSON ili parsiranje HTML ili drugog tela koje nije JSON kao da jeste JSON.

Tačan tekst greške zavisi od JavaScript izvršnog okruženja i pregledača. Ne pretpostavljajte da svaki runtime ispisuje „Unexpected token X in JSON at position N“.

Ovo je otklanjanje Unexpected token u JSON.parse: šta greška znači, kako čitati poziciju i šta raditi kada je telo HTML. Širi pregled završnog zareza, navodnika i Unexpected end je u Česte JSON greške: završni zarez, navodnici i Unexpected token.

Šta znači “Unexpected token” u JSON.parse()?

JSON.parse() zahteva JSON gramatiku. Nedozvoljen znak na trenutnoj poziciji baca SyntaxError. {“name”:“Alex”,} je nevažeće: posle tog zareza objekat ne sme da se zatvori. Tekst poruke i pozicija i dalje variraju po runtime-u.

Koju grešku baca JSON.parse()?

Nevažeći JSON obično baca SyntaxError. Zabeležite error.name da potvrdite tip. Nemojte hardkodirati ceo error.message: motori i verzije ga formulišu različito.

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

1. Jednostruki umesto dvostrukih navodnika

{‘name’:‘Alex’} je nevažeći JSON. {“name”:“Alex”} je važeći. JSON niske i imena članova objekta koriste dvostruke navodnike. Literal JavaScript objekta kao const user = { name: ‘Alex’ } može biti ispravan JavaScript, a da i dalje nije JSON tekst.

Nevažeće

{'name':'Alex'}

Važeće

{"name":"Alex"}

2. Završni zarezi

Zarez posle poslednjeg svojstva ili stavke niza nije važeći standardni JSON. {“name”:“Alex”,“age”:30,} i [1, 2, 3,] oba padaju. Tretirajte to kao jedan uzrok Unexpected token; Česte JSON greške: završni zarez, navodnici i Unexpected token završne zareze pokriva dublje.

Nevažeće

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

Važeće

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

3. Imena svojstava bez navodnika

{ name: “Alex” } može biti literal JavaScript objekta. U JSON imena članova objekta su niske i trebaju dvostruke navodnike: {“name”:“Alex”}.

Nevažeće

{
  name: "Alex"
}

Važeće

{
  "name": "Alex"
}

4. Neispravan escape niske

U JSON tekstu obrnuta kosa crta počinje escape. Sirova putanja kao C:\Users\Alex je nevažeća jer \U nije zakonit escape. Udvostručite obrnute crte. Ne mešajte escape jezika-domaćina sa JSON escape-om. Česte JSON greške: završni zarez, navodnici i Unexpected token to pokriva dublje.

Nevažeće

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

Važeće

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

5. Dodatni tekst pre ili posle JSON

JSON.parse očekuje jednu JSON vrednost. Prefiks kao Success: ispred {“ok”:true}, ili sufiks kao done iza nje, čini celu nisku nevažećom. Beznačajan belina oko jedne JSON vrednosti je dozvoljena. JSON ne zabranjuje razmake pre ili posle vrednosti.

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

6. Parsiranje HTML umesto JSON

Poziv response.json() na HTML stranici je čest slučaj Unexpected token. Pogrešni endpointi, HTML stranice 404 ili 500, login redirekcije, tela proksija i rezervne stranice često počinju oznakama. „Unexpected token < uvek znači HTML“ je prejako: < je trag, ne dokaz.

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

Šta obično znači “Unexpected token <”?

JSON vrednosti obično ne počinju sa <. Ako telo počinje sa ili , < može biti prvi nedozvoljen znak. Pri lokalnom otklanjanju proverite HTTP status, Content-Type i sirovo telo. Formulacija motora i dalje varira.

Proverite odgovor pre parsiranja

Telo fetch može da se potroši samo jednom. Pri lokalnom otklanjanju prvo pročitajte text(), pregledajte kratak prefiks, pa JSON.parse tu istu nisku. Ne pozivajte response.json() pa zatim response.text() na istom odgovoru. Podrazumevano ne logujte osetljive produkcione terete.

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);
}

Šta znači “at position 123”?

Neki motori prijave poziciju, liniju ili kolonu. Potražite u blizini loš navodnik, zarez, zagradu ili escape. Taj indeks je gde je parsiranje primetilo problem; pravi uzrok može biti ranije. Nije zagarantovano da je to tačno pokvareni znak.

Unexpected token naspram Unexpected end

Unexpected token znači da je parser sreo znak koji nije očekivao. Unexpected end može da se pojavi kada se ulaz zaustavi pre nego što je vrednost kompletna, kao u {“name”:“Alex” bez zatvarajuće zagrade. Tačna formulacija zavisi od motora. Česte JSON greške: završni zarez, navodnici i Unexpected token nepotpun JSON pokriva šire.

{"name":"Alex"

JSON nije isto što i literal JavaScript objekta

JSON je format podataka. Literal JavaScript objekta je JavaScript sintaksa. JS objekat sa ključevima bez navodnika, jednostrukim navodnicima i završnim zarezom nije važeći JSON tekst. JSON.parse ne može bezbedno da parsira literale JavaScript objekata.

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

Može li JSON sadržati komentare?

Standardni JSON ne podržava komentare. Linija // unutar objekta je nevažeća. JSON5 i slična proširenja su drugi formati. Форматирање и поређење JSON-а proverava standardni JSON sa JSON.parse i ne tretira JSON5 kao JSON.

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

Da li su undefined, NaN i Infinity važeći JSON?

Ne. JSON vrednosti su objekat, niz, niska, broj, true, false i null. undefined, NaN i Infinity nisu. Vrednost na vrhu ne mora biti objekat ili niz: true, 123, “hello” i null jesu važeći JSON.

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

Kako korak po korak popraviti grešku Unexpected token

Radite na izvoru, ne na niski greške:

  1. Potvrdite da je ulaz zaista JSON, a ne HTML, dnevnici ili JavaScript.
  2. Pregledajte prve znakove sirovog ulaza.
  3. Ako je stigao sa API-ja, proverite HTTP status i Content-Type. Ni 200 ni application/json ne garantuju važeći JSON.
  4. Proverite sintaksu u JSON parseru.
  5. Prijavljenu poziciju, liniju ili kolonu koristite kao trag, ne kao zagarantovani koren problema.
  6. Proverite navodnike, zareze, vitice, uglaste zagrade i escape u blizini te zone.
  7. Uporedite sa formatiranom, proverenom kopijom.
  8. Popravite serijalizator ili endpoint. Ne brišite prijavljeni token naslepo.
Nemojte „popravljati“ JSON nasumičnom zamenom navodnika

Globalna zamena ' sa " može slomiti apostrofe unutar niski, već escape-ovan tekst i izvore koji nisu JSON. Proizvedite važeći JSON iz pravog serijalizatora. Ne tretirajte eval kao JSON parser.

Koristite JSON.stringify() kada u JavaScriptu proizvodite JSON

Radije JSON.stringify nego ručno spajanje niski. Emituje važeći JSON tekst za vrednosti koje serijalizuje. Ne čuva svaku JavaScript vrednost: undefined, funkcije i simboli imaju posebno ponašanje. Taj detalj ovde nije u opsegu.

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

Nevažeći JSON naspram prave ispravke

Ovi parovi su provereni sa JSON.parse. Za HTML, ispravka je odgovor, ne izmena sintakse.

Problem Nevažeće Ispravka
Jednostruki navodnici {'a':1} {"a":1}
Završni zarez {"a":1,} {"a":1}
Ključ bez navodnika {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML telo <html>... Proverite endpoint i sirovi odgovor. Ne pretvarajte HTML u JSON ručnim uređivanjem.

Jednostavan vodič odluke za Unexpected token

Ako je JSON.parse pao, utvrdite da li uopšte imate JSON pre nego što prepisujete navodnike.

  • JSON.parse je pao
  • Sa API-ja? Proverite status, Content-Type i sirovo telo
  • Počinje li kao JSON? Ako ne, popravite izvor ili endpoint
  • Ako da, proverite navodnike, zareze, vitice, uglaste zagrade, escape, nepodržane vrednosti
  • Prijavljenu poziciju koristite kao trag
  • Popravite izvor, pa parsajte ponovo
Unexpected token imenuje iznenađenje. Izvor teksta je često prava ispravka.

Proverite JSON pre parsiranja ili korišćenja

NEXNARA Форматирање и поређење JSON-а proverava JSON u pregledaču sa JSON.parse—ne eval.

Provera, lepo formatiranje sa 2 razmaka, 4 razmaka ili tabulatorima, minify, kopiranje, preuzimanje i otpremanje .json. JSON Diff pokriva ugnježdene objekte i nizove, putanje, rezime, filtere i zamenu. Posle parsiranja, lepo formatirana i minify kopija istih podataka porede se kao jednake; ključevi objekta porede se po imenu.

Tekst veći od 5 MB može delovati sporo. Tekst veći od 15 MB se u pregledaču ne obrađuje.

Provera i formatiranje JSON dešavaju se u vašem pregledaču. Ovaj alat ne šalje JSON na NEXNARA server. Reklame i ostale funkcije sajta i dalje koriste mrežu.

Nalepite nisku koja pada u Форматирање и поређење JSON-а i pročitajte prve znakove pre nego što prepisujete navodnike.

FAQ

Zašto JSON.parse kaže Unexpected token?

Tekst nije važeći JSON na mestu gde se parser zaustavio. Tipični uzroci su navodnici, zarezi, dodatni tekst ili telo koje nije JSON, na primer HTML.

Šta znači Unexpected token < in JSON?

Prvi nedozvoljen znak može biti <. To često ukazuje na HTML stranicu, ali nije dokaz 404 niti HTML u svakom slučaju. Proverite status, Content-Type i sirovo telo.

Kako da nađem poziciju greške u JSON?

Ako motor prijavi poziciju, liniju ili kolonu, pogledajte u blizini. Prava greška može biti ranije. Koristite to kao trag, pa proverite.

Može li JSON koristiti jednostruke navodnike?

Ne. U standardnom JSON niske i imena članova koriste dvostruke navodnike.

Može li JSON imati završne zareze?

Ne. Standardni JSON ne dozvoljava zarez posle poslednjeg svojstva ili stavke niza.

Kako da proverim da li je niska važeći JSON?

Pozovite JSON.parse u try/catch, ili nalepite tekst u Форматирање и поређење JSON-а. Ako parsiranje baci SyntaxError, niska nije važeći JSON.