Tech Help

Zašto JSON.parse prijavljuje "Unexpected token"?

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

Brzi pregled

JSON.parse() baca SyntaxError kad ulaz nije važeći JSON. „Unexpected token“ uglavnom znači da je parser došao do znaka koji na toj tački strukture nije dozvoljen.

Uobičajeni uzroci uključuju jednostruke navodnike, završne zareze, imena svojstava bez navodnika, loš escape stringa, dodatni tekst oko JSON, ili parsiranje HTML ili drugog tijela koje nije JSON kao da jeste JSON.

Tačna formulacija greške varira po JavaScript motoru i pregledniku. Ne pretpostavljajte da svako izvršno okruženje ispisuje „Unexpected token X in JSON at position N“.

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

Šta označava “Unexpected token” u JSON.parse()?

JSON.parse() zahtijeva JSON gramatiku. Nedozvoljeni znak na trenutnoj poziciji baca SyntaxError. {“name”:“Alex”,} je nevažeće: poslije tog zareza objekat se ne smije zatvoriti. Tekst poruke i pozicija i dalje variraju po runtimeu.

Kakvu grešku baca JSON.parse()?

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

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

1. Jednostruki navodnici umjesto dvostrukih

{‘name’:‘Alex’} je nevažeći JSON. {“name”:“Alex”} je važeći. JSON stringovi 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.

Pogrešno

{'name':'Alex'}

Ispravno

{"name":"Alex"}

2. Zarez poslije zadnje stavke

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

Pogrešno

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

Ispravno

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

3. Svojstva bez navodnika oko imena

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

Pogrešno

{
  name: "Alex"
}

Ispravno

{
  "name": "Alex"
}

4. Neispravan escape stringa

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. Nemojte miješati escape jezika-domaćina s JSON escapeom. Česte JSON greške: završni zarez, navodnici i Unexpected token to pokriva dublje.

Pogrešno

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

Ispravno

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

5. Dodatni tekst prije ili poslije JSON

JSON.parse očekuje jednu JSON vrijednost. Prefiks kao Success: ispred {“ok”:true}, ili sufiks kao done iza nje, čini cijeli string nevažećim. Beznačajan razmak oko jedne JSON vrijednosti je dozvoljen. JSON ne zabranjuje razmake prije ili poslije vrijednosti.

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

6. Parsirati HTML kao da je JSON

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

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

Šta “Unexpected token <” obično označava?

JSON vrijednosti obično ne počinju s <. Ako tijelo počinje s ili , < može biti prvi nedozvoljeni znak. Pri lokalnom otklanjanju grešaka provjerite HTTP status, Content-Type i sirovo tijelo. Formulacija motora i dalje varira.

Provjerite odgovor prije nego što parsirate

Tijelo fetch može se potrošiti samo jednom. Pri lokalnom otklanjanju grešaka prvo pročitajte text(), pregledajte kratki prefiks, zatim JSON.parse na isti string. Nemojte pozvati response.json() pa zatim response.text() na istom odgovoru. Podrazumijevano ne bilježite osjetljive produkcijske 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 poruka “at position 123” označava?

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

Unexpected token u odnosu na Unexpected end

Unexpected token znači da je parser sreo znak koji nije očekivao. Unexpected end može se pojaviti kad se ulaz zaustavi prije nego što je vrijednost kompletna, kao u {“name”:“Alex” bez zatvarajuće vitičaste 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 se razlikuje od literala JavaScript objekta

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

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

Sadrži li JSON komentare?

Standardni JSON ne podržava komentare. Linija // unutar objekta je nevažeća. JSON5 i slična proširenja su drugi formati. Formatiranje i poređenje JSON-a provjerava standardni JSON s JSON.parse i ne tretira JSON5 kao JSON.

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

Jesu li undefined, NaN te Infinity važeći JSON?

Ne. JSON vrijednosti su objekat, niz, string, broj, true, false i null. undefined, NaN i Infinity nisu. Vrijednost 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 popraviti Unexpected token grešku redom

Radite na izvoru, ne na stringu greške:

  1. Potvrdite da je ulaz zaista JSON, a ne HTML, zapisi ili JavaScript.
  2. Pogledajte početne znakove sirovog unosa.
  3. Ako je došao s API-ja, provjerite HTTP status i Content-Type. Ni 200 ni application/json ne garantuju važeći JSON.
  4. Validirajte sintaksu JSON parserom.
  5. Prijavljenu poziciju, liniju ili kolonu koristite kao trag, ne kao zagarantovani korijen problema.
  6. Provjerite navodnike, zareze, vitičaste zagrade, uglaste zagrade i escape u blizini te zone.
  7. Uporedite s formatiranom, provjerenom kopijom.
  8. Popravite serijalizator ili endpoint. Nemojte nasumice brisati prijavljeni token.
Nemojte „krpiti“ JSON nasumičnom zamjenom navodnika

Globalna zamjena ' s " može slomiti apostrofe unutar stringova, već escapeovani tekst i izvore koji nisu JSON. Proizvedite važeći JSON iz pravog serijalizatora. Nemojte tretirati eval kao JSON parser.

Koristite JSON.stringify() kad stvarate JSON u JavaScriptu

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

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

Nevažeći JSON u odnosu na stvarnu ispravku

Ovi parovi su provjereni s JSON.parse. Za HTML, ispravka je odgovor, ne izmjena sintakse.

Teškoća Pogrešno Popravak
Jednostruki navodnici u stringu {'a':1} {"a":1}
Zarez na kraju niza {"a":1,} {"a":1}
Ime ključa bez navodnika {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
HTML sadržaj tijela <html>... Provjerite endpoint i sirovi odgovor. Nemojte uređivati HTML da postane JSON.

Kratki vodič za odluku kod Unexpected token

Ako je JSON.parse pao, utvrdite imate li uopće JSON prije nego što prepisujete navodnike.

  • JSON.parse nije uspio
  • Dolazi li s API-ja? Provjerite status, Content-Type i sirovo tijelo
  • Počinje li tekst kao JSON? Ako ne, ispravite izvor ili endpoint
  • Ako da, provjerite navodnike, zareze, vitičaste zagrade, uglaste zagrade, escape, nepodržane vrijednosti
  • Koristite prijavljenu poziciju samo kao trag
  • Popravite izvor, zatim parsirajte ponovo
Unexpected token imenuje iznenađenje. Stvarna ispravka je često izvor teksta.

Validirajte JSON prije parsiranja ili upotrebe

NEXNARA Formatiranje i poređenje JSON-a validira JSON u pregledniku pomoću JSON.parse—ne eval.

Provjera, lijepo formatiranje s 2 razmaka, 4 razmaka ili tabulatorima, minify, kopiranje, preuzimanje i otpremanje .json. JSON Diff pokriva ugniježđene objekte i nizove, putanje, sažetak, filtere i zamjenu. Poslije parsiranja, lijepo 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 djelovati sporo. Tekst veći od 15 MB se u pregledniku ne obrađuje.

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

Zalijepite string koji pada u Formatiranje i poređenje JSON-a i pročitajte prve znakove prije nego što prepisujete navodnike.

FAQ

Zašto JSON.parse prijavljuje Unexpected token?

Tekst nije važeći JSON na mjestu gdje se parser zaustavio. Tipični uzroci su navodnici, zarezi, dodatni tekst ili tijelo koje nije JSON, npr. HTML.

Šta označava Unexpected token < in JSON?

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

Kako pronaći poziciju greške unutar JSON?

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

Da li JSON smije koristiti jednostruke navodnike?

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

Da li JSON smije imati završne zareze?

Ne. Standardni JSON ne dozvoljava zarez poslije posljednjeg svojstva ili stavke niza.

Kako da provjerim da li je string važeći JSON?

Pozovite JSON.parse u try/catch, ili zalijepite tekst u Formatiranje i poređenje JSON-a. Ako parsiranje baci SyntaxError, string nije važeći JSON.