Tech Help
Zašto JSON.parse javlja "Unexpected token"?
JSON.parse baca Unexpected token kad tekst nije važeći JSON. Provjerite jednostruke navodnike, završne zareze, HTML odgovore i položaj pogreške.
JSON.parse() baca SyntaxError kad ulaz nije važeći JSON. „Unexpected token“ u pravilu znači da je parser došao do znaka koji na toj točki strukture nije dopušten.
Uobičajeni uzroci uključuju jednostruke navodnike, završne zareze, nazive svojstava bez navodnika, loš escape niza, dodatni tekst oko JSON ili parsiranje HTML ili drugog tijela koje nije JSON kao da jest JSON.
Točno navođenje pogreške razlikuje se po JavaScript motoru i pregledniku. Nemojte pretpostaviti da svako izvršno okruženje ispisuje „Unexpected token X in JSON at position N“.
Ovo je dijagnostika Unexpected token u JSON.parse: što pogreška znači, kako čitati položaj i što učiniti kad je tijelo HTML. Širi prikaz završnog zareza, navodnika i Unexpected end nalazi se u Česte JSON pogreške: završni zarez, navodnici i Unexpected token.
Što znači “Unexpected token” u JSON.parse()?
JSON.parse() zahtijeva JSON gramatiku. Nedopušteni znak na trenutačnom položaju baca SyntaxError. {“name”:“Alex”,} je nevažeće: nakon tog zareza objekt se ne smije zatvoriti. Tekst poruke i položaj i dalje variraju ovisno o runtimeu.
Koju pogrešku baca JSON.parse()?
Nevažeći JSON u pravilu baca SyntaxError. Zabilježite error.name da potvrdite vrstu. Nemojte hardkodirati cijeli error.message: motori i inačice formuliraju ga različito.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Upotreba jednostrukih umjesto dvostrukih navodnika
{‘name’:‘Alex’} je nevažeći JSON. {“name”:“Alex”} je važeći. JSON nizovi i nazivi članova objekta koriste dvostruke navodnike. Literal JavaScript objekta poput const user = { name: ‘Alex’ } može biti valjani JavaScript, a da i dalje nije JSON tekst.
Neispravno
{'name':'Alex'}
Ispravno
{"name":"Alex"}
2. Zarezi na kraju
Zarez nakon posljednjeg svojstva ili stavke polja 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 pogreške: završni zarez, navodnici i Unexpected token završne zareze pokriva detaljnije.
Neispravno
{
"name": "Alex",
"age": 30,
}
Ispravno
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Nazivi svojstava bez navodnika
{ name: “Alex” } može biti literal JavaScript objekta. U JSON nazivi članova objekta su nizovi i trebaju dvostruke navodnike: {“name”:“Alex”}.
Neispravno
{
name: "Alex"
}
Ispravno
{
"name": "Alex"
}
4. Neispravan escape niza
U JSON tekstu obrnuta kosa crta započinje escape. Sirova putanja poput 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 pogreške: završni zarez, navodnici i Unexpected token to pokriva detaljnije.
Neispravno
{"file":"C:\Users\Alex"}
Ispravno
{"file":"C:\\Users\\Alex"}
5. Dodatni tekst prije ili nakon JSON
JSON.parse očekuje jednu JSON vrijednost. Prefiks poput Success: ispred {“ok”:true}, ili sufiks poput done iza nje, čini cijeli niz nevažećim. Beznačajni razmaci oko jedne JSON vrijednosti dopušteni su. JSON ne zabranjuje razmake prije ili nakon vrijednosti.
Success:
{"ok":true}
{"ok":true}
done
6. Parsiranje HTML umjesto JSON
Poziv response.json() na HTML stranici čest je slučaj Unexpected token. Pogrešni endpointi, HTML stranice 404 ili 500, preusmjeravanja prijave, tijela proxyja i pričuvne stranice često počinju označavanjem. „Unexpected token < uvijek znači HTML“ pretjerano je: < je trag, ne dokaz.
fetch('/api/data')
.then(response => response.json())
Što obično znači “Unexpected token <”?
JSON vrijednosti obično ne počinju s <. Ako tijelo počinje s ili , < može biti prvi nedopušteni znak. Pri lokalnom otklanjanju pogrešaka provjerite HTTP status, Content-Type i sirovo tijelo. Formulacija motora i dalje varira.
Provjerite odgovor prije parsiranja
Tijelo fetch može se potrošiti samo jednom. Pri lokalnom otklanjanju pogrešaka prvo pročitajte text(), pregledajte kratki prefiks, zatim JSON.parse na isti niz. Nemojte pozvati response.json() pa zatim response.text() na istom odgovoru. Prema zadanim postavkama ne zapisujte 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);
}
Što znači “at position 123”?
Neki motori prijave položaj, redak ili stupac. Potražite u blizini loš navodnik, zarez, zagradu ili escape. Taj indeks je gdje je parsiranje uočilo problem; pravi uzrok može biti ranije. Nije zajamčeno da je to točno neispravni znak.
Unexpected token nasuprot Unexpected end
Unexpected token znači da je parser naišao na znak koji nije očekivao. Unexpected end može se pojaviti kad se ulaz zaustavi prije nego što je vrijednost potpuna, kao u {“name”:“Alex” bez zatvarajuće vitičaste zagrade. Točna formulacija ovisi o motoru. Česte JSON pogreške: završni zarez, navodnici i Unexpected token nepotpuni JSON pokriva šire.
{"name":"Alex"
JSON nije jednak literalu JavaScript objekta
JSON je podatkovni format. Literal JavaScript objekta je JavaScript sintaksa. JS objekt 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
}
Može li JSON sadržavati komentare?
Standardni JSON ne podržava komentare. Linija // unutar objekta je nevažeća. JSON5 i slična proširenja drugi su formati. Formatiranje i usporedba JSON-a provjerava standardni JSON s JSON.parse i ne tretira JSON5 kao JSON.
{
// user name
"name": "Alex"
}
Jesu li undefined, NaN i Infinity važeći JSON?
Ne. JSON vrijednosti su objekt, polje, niz, broj, true, false i null. undefined, NaN i Infinity nisu. Vrijednost na vrhu ne mora biti objekt ili polje: true, 123, “hello” i null jesu važeći JSON.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Kako korak po korak ispraviti pogrešku Unexpected token
Radite na izvoru, ne na nizu pogreške:
- Potvrdite da je ulaz stvarno JSON, a ne HTML, zapisnici ili JavaScript.
- Pogledajte početne znakove sirovog unosa.
- Ako je došao s API-ja, provjerite HTTP status i Content-Type. Ni 200 ni application/json ne jamče važeći JSON.
- Provjerite sintaksu u JSON parseru.
- Prijavljeni položaj, redak ili stupac koristite kao trag, ne kao zajamčeni korijen problema.
- Provjerite navodnike, zareze, vitičaste zagrade, uglate zagrade i escape u blizini tog područja.
- Usporedite s formatiranom, provjerenom kopijom.
- Ispravite serijalizator ili endpoint. Nemojte nasumično brisati prijavljeni token.
Globalna zamjena ' s " može slomiti apostrofe unutar nizova, već escapeani tekst i izvore koji nisu JSON. Proizvedite važeći JSON iz pravog serijalizatora. Nemojte tretirati eval kao JSON parser.
Koristite JSON.stringify() kad u JavaScriptu proizvodite JSON
Radije JSON.stringify nego ručno spajanje nizova. Emitira važeći JSON tekst za vrijednosti koje serijalizira. 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 nasuprot pravoj ispravci
Ovi su parovi provjereni s JSON.parse. Za HTML ispravka je odgovor, ne uređivanje sintakse.
| Uzrok | Neispravno | Rješenje |
|---|---|---|
| Jednostruki navodnik | {'a':1} |
{"a":1} |
| Zarez na kraju | {"a":1,} |
{"a":1} |
| Naziv bez navodnika | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| HTML tijelo | <html>... |
Provjerite endpoint i sirovi odgovor. Nemojte uređivati HTML da bi postao JSON. |
Jednostavan dijagram odluke za Unexpected token
Ako je JSON.parse neuspio, utvrdite imate li uopće JSON prije nego što prepisujete navodnike.
- JSON.parse nije uspio
- S API-ja? Provjerite status, Content-Type i sirovo tijelo
- Počinje li kao JSON? Ako ne, ispravite izvor ili endpoint
- Ako da, provjerite navodnike, zareze, vitičaste zagrade, uglate zagrade, escape, nepodržane vrijednosti
- Prijavljeni položaj koristite kao trag
- Ispravite izvor, zatim parsirajte ponovno
Provjerite JSON prije parsiranja ili korištenja
NEXNARA Formatiranje i usporedba JSON-a provjerava JSON u pregledniku s JSON.parse—ne eval.
Provjera, lijepo formatiranje s 2 razmaka, 4 razmaka ili tabulatorima, minify, kopiranje, preuzimanje i prijenos .json. JSON Diff pokriva ugniježđene objekte i polja, putanje, sažetak, filtre i zamjenu. Nakon parsiranja, lijepo formatirana i minify kopija istih podataka uspoređuju se kao jednake; ključevi objekta uspoređuju se po nazivu.
Tekst veći od 5 MB može djelovati sporo. Tekst veći od 15 MB ne obrađuje se u pregledniku.
Provjera i formatiranje JSON odvijaju se u vašem pregledniku. Ovaj alat ne šalje JSON na NEXNARA poslužitelj. Oglasi i ostale značajke stranice i dalje koriste mrežu.
Zalijepite niz koji ne uspijeva u Formatiranje i usporedba JSON-a i pročitajte prve znakove prije nego što prepisujete navodnike.
FAQ
Zašto JSON.parse javlja Unexpected token?
Tekst nije važeći JSON na točki na kojoj se parser zaustavio. Tipični uzroci su navodnici, zarezi, dodatni tekst ili tijelo koje nije JSON, poput HTML.
Što znači Unexpected token < in JSON?
Prvi nedopušteni znak može biti <. To često upućuje na HTML stranicu, ali nije dokaz 404 niti HTML u svakom slučaju. Provjerite status, Content-Type i sirovo tijelo.
Kako pronaći položaj pogreške u JSON?
Ako motor prijavi položaj, redak ili stupac, pogledajte u blizini. Prava pogreška može biti ranije. Koristite to kao trag, zatim provjerite.
Smije li JSON koristiti jednostruke navodnike?
Ne. U standardnom JSON nizovi i nazivi članova koriste dvostruke navodnike.
Smije li JSON sadržavati završne zareze?
Ne. Standardni JSON ne dopušta zarez nakon posljednjeg svojstva ili stavke polja.
Kako provjeriti je li niz važeći JSON?
Pozovite JSON.parse u try/catch ili zalijepite tekst u Formatiranje i usporedba JSON-a. Ako parsiranje baci SyntaxError, niz nije važeći JSON.