Tech Help

Zakaj JSON.parse sporoča "Unexpected token"?

JSON.parse vrže Unexpected token, ko besedilo ni veljaven JSON. Odpravite enojne narekovaje, končne vejice, odzive HTML in položaj napake.

Hiter odgovor

JSON.parse() vrže SyntaxError, kadar vhod ni veljaven JSON. »Unexpected token« običajno pomeni, da je razčlenjevalnik naletel na znak, ki na tisti točki zgradbe ni dovoljen.

Pogosti vzroki so enojni narekovaji, končne vejice, imena lastnosti brez narekovajev, slab escape niza, dodatno besedilo okoli JSON ali razčlenjevanje HTML ali drugega telesa, ki ni JSON, kot da bi bil JSON.

Natančno besedilo napake se razlikuje po JavaScript pogonu in brskalniku. Ne predpostavljajte, da vsako izvajalno okolje izpiše »Unexpected token X in JSON at position N«.

To je odpravljanje Unexpected token pri JSON.parse: kaj napaka pomeni, kako brati položaj in kaj storiti, ko je telo HTML. Širši pregled končne vejice, narekovajev in Unexpected end je v Pogoste JSON napake: končna vejica, narekovaji in Unexpected token.

Kaj pomeni “Unexpected token” v JSON.parse()?

JSON.parse() zahteva JSON slovnico. Nedovoljen znak na trenutnem položaju vrže SyntaxError. {“name”:“Alex”,} je neveljaven: za to vejico se objekt ne sme končati. Besedilo sporočila in položaj se še vedno razlikujeta po runtimeu.

Kakšno napako vrže JSON.parse()?

Neveljaven JSON običajno vrže SyntaxError. Zabeležite error.name, da potrdite vrsto. Ne zakodirajte celotnega error.message: pogoni in različice ga oblikujejo drugače.

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

1. Uporaba enojnih namesto dvojnih narekovajev

{‘name’:‘Alex’} je neveljaven JSON. {“name”:“Alex”} je veljaven. JSON nizi in imena članov objekta uporabljajo dvojne narekovaje. Literal objekta JavaScript, kot je const user = { name: ‘Alex’ }, je lahko veljaven JavaScript in vseeno ni JSON besedilo.

Neveljavno

{'name':'Alex'}

Veljavno

{"name":"Alex"}

2. Končne vejice

Vejica za zadnjo lastnostjo ali elementom polja ni veljaven standardni JSON. {“name”:“Alex”,“age”:30,} in [1, 2, 3,] oba spodletita. Obravnavajte to kot en vzrok Unexpected token; Pogoste JSON napake: končna vejica, narekovaji in Unexpected token končne vejice obravnava globlje.

Neveljavno

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

Veljavno

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

3. Imena lastnosti brez narekovajev

{ name: “Alex” } je lahko literal objekta JavaScript. V JSON so imena članov objekta nizi in potrebujejo dvojne narekovaje: {“name”:“Alex”}.

Neveljavno

{
  name: "Alex"
}

Veljavno

{
  "name": "Alex"
}

4. Neveljaven escape niza

V JSON besedilu obrnjena poševnica začne escape. Surova pot, kot je C:\Users\Alex, je neveljavna, ker \U ni zakonit escape. Podvojite obrnjene poševnice. Ne mešajte escape gostiteljskega jezika z JSON escape. Pogoste JSON napake: končna vejica, narekovaji in Unexpected token to obravnava globlje.

Neveljavno

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

Veljavno

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

5. Dodatno besedilo pred JSON ali za njim

JSON.parse pričakuje eno JSON vrednost. Predpona, kot je Success: pred {“ok”:true}, ali pripona, kot je done za njo, naredi celoten niz neveljaven. Nebistveni presledki okoli ene JSON vrednosti so dovoljeni. JSON ne prepoveduje presledkov pred vrednostjo ali za njo.

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

6. Razčlenjevanje HTML namesto JSON

Klic response.json() na strani HTML je pogost primer Unexpected token. Napačni endpointi, strani HTML 404 ali 500, preusmeritve prijave, telesa posrednikov in nadomestne strani se pogosto začnejo z označevanjem. »Unexpected token < vedno pomeni HTML« je premočno: < je namig, ne dokaz.

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

Kaj običajno pomeni “Unexpected token <”?

JSON vrednosti se običajno ne začnejo z <. Če se telo začne z ali , je < lahko prvi nedovoljeni znak. Pri krajevnem odpravljanju napak preverite HTTP status, Content-Type in surovo telo. Besedilo pogona se še vedno razlikuje.

Preverite odziv pred razčlenjevanjem

Telo fetch je mogoče porabiti samo enkrat. Pri krajevnem odpravljanju napak najprej preberite text(), preglejte kratek predpono, nato JSON.parse istega niza. Ne kličite response.json() in nato response.text() na istem odzivu. Privzeto ne beležite občutljivih produkcijskih tovorov.

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

Kaj pomeni “at position 123”?

Nekateri pogoni sporočijo položaj, vrstico ali stolpec. V bližini poiščite slab narekovaj, vejico, oklepaj ali escape. Ta indeks je, kjer je razčlenjevanje opazilo težavo; pravi vzrok je lahko prej. Ni zagotovljeno, da je to točno napačni znak.

Unexpected token proti Unexpected end

Unexpected token pomeni, da je razčlenjevalnik srečal znak, ki ga ni pričakoval. Unexpected end se lahko pojavi, ko se vhod ustavi, preden je vrednost popolna, kot v {“name”:“Alex” brez zaklepaja. Natančno besedilo je odvisno od pogona. Pogoste JSON napake: končna vejica, narekovaji in Unexpected token nepopoln JSON obravnava širše.

{"name":"Alex"

JSON ni isto kot literal objekta JavaScript

JSON je podatkovni zapis. Literal objekta JavaScript je skladnja JavaScript. Objekt JS s ključi brez narekovajev, enojnimi narekovaji in končno vejico ni veljavno JSON besedilo. JSON.parse ne more varno razčleniti literalov objektov JavaScript.

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

Ali sme JSON vsebovati komentarje?

Standardni JSON ne podpira komentarjev. Vrstica // znotraj objekta je neveljavna. JSON5 in podobne razširitve so drugi formati. Oblikovanje in primerjava JSON-a preverja standardni JSON z JSON.parse in JSON5 ne obravnava kot JSON.

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

Ali so undefined, NaN in Infinity veljaven JSON?

Ne. JSON vrednosti so objekt, polje, niz, število, true, false in null. undefined, NaN in Infinity niso. Vrhovna vrednost ni nujno objekt ali polje: true, 123, “hello” in null so veljaven JSON.

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

Kako korak za korakom popraviti napako Unexpected token

Delajte na viru, ne na nizu napake:

  1. Potrdite, da je vhod res JSON, ne HTML, dnevniki ali JavaScript.
  2. Preglejte prve znake surovega vhoda.
  3. Če je prišel z API, preverite HTTP status in Content-Type. Niti 200 niti application/json ne zagotavljata veljavnega JSON.
  4. Preverite skladnjo v JSON razčlenjevalniku.
  5. Prijavljeni položaj, vrstico ali stolpec uporabite kot namig, ne kot zagotovljeni koren težave.
  6. Preverite narekovaje, vejice, zavite oklepaje, oglate oklepaje in escape v bližini tistega območja.
  7. Primerjajte z oblikovano, preverjeno kopijo.
  8. Popravite serializator ali endpoint. Ne brišite prijavljenega žetona na slepo.
Ne »popravljajte« JSON z naključno zamenjavo narekovajev

Globalna zamenjava ' z " lahko zlomi opuščaje znotraj nizov, že ubežano besedilo in vire, ki niso JSON. Ustvarite veljaven JSON iz pravega serializatorja. Ne obravnavajte eval kot JSON razčlenjevalnik.

Uporabite JSON.stringify() pri izdelavi JSON v JavaScript

Raje JSON.stringify kot ročno spajanje nizov. Odda veljavno JSON besedilo za vrednosti, ki jih serializira. Ne ohrani vsake JavaScript vrednosti: undefined, funkcije in simboli imajo posebno obnašanje. Ta podrobnost tukaj ni v obsegu.

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

Neveljaven JSON proti pravemu popravku

Ti pari so bili preverjeni z JSON.parse. Za HTML je popravek odziv, ne urejanje skladnje.

Težava Neveljavno Popravek
Enojni narekovaji {'a':1} {"a":1}
Končna vejica {"a":1,} {"a":1}
Ključ brez narekovajev {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Telo HTML <html>... Preverite endpoint in surovi odziv. Ne urejajte HTML v JSON.

Preprost vodnik odločitev za Unexpected token

Če je JSON.parse spodletel, najprej ugotovite, ali sploh imate JSON, preden prepisujete narekovaje.

  • JSON.parse je spodletel
  • Z API? Preverite status, Content-Type in surovo telo
  • Se začne kot JSON? Če ne, popravite vir ali endpoint
  • Če da, preverite narekovaje, vejice, zavite oklepaje, oglate oklepaje, escape, nepodprte vrednosti
  • Prijavljeni položaj uporabite kot namig
  • Popravite vir, nato znova razčlenite
Unexpected token poimenuje presenečenje. Vir besedila je pogosto pravi popravek.

Preverite JSON pred razčlenjevanjem ali uporabo

NEXNARA Oblikovanje in primerjava JSON-a preverja JSON v brskalniku z JSON.parse—ne eval.

Preverjanje, lepo oblikovanje z 2 presledkoma, 4 presledki ali tabulatorji, minify, kopiranje, prenos in nalaganje .json. JSON Diff pokriva gnezdene objekte in polja, poti, povzetek, filtre in zamenjavo. Po razčlenitvi se lepo oblikovana in minify kopija istih podatkov primerjata kot enaki; ključi objekta se primerjajo po imenu.

Besedilo, večje od 5 MB, se lahko zdi počasno. Besedila, večjega od 15 MB, brskalnik ne obdela.

Preverjanje in oblikovanje JSON potekata v vašem brskalniku. To orodje JSON ne pošilja na strežnik NEXNARA. Oglasi in druge funkcije spletnega mesta še vedno uporabljajo omrežje.

Prilepite niz, ki spodleti, v Oblikovanje in primerjava JSON-a in preberite prve znake, preden prepisujete narekovaje.

FAQ

Zakaj JSON.parse sporoča Unexpected token?

Besedilo ni veljaven JSON na točki, kjer se je razčlenjevalnik ustavil. Tipični vzroki so narekovaji, vejice, dodatno besedilo ali telo, ki ni JSON, na primer HTML.

Kaj pomeni Unexpected token < in JSON?

Prvi nedovoljeni znak je lahko <. To pogosto kaže na stran HTML, vendar ni dokaz 404 niti HTML v vsakem primeru. Preverite status, Content-Type in surovo telo.

Kako najdem položaj napake v JSON?

Če pogon sporoči položaj, vrstico ali stolpec, poglejte v bližini. Prava napaka je lahko prej. Uporabite to kot namig, nato preverite.

Ali sme JSON uporabljati enojne narekovaje?

Ne. V standardnem JSON nizi in imena članov uporabljajo dvojne narekovaje.

Ali sme JSON imeti končne vejice?

Ne. Standardni JSON ne dovoljuje vejice za zadnjo lastnostjo ali elementom polja.

Kako preverim, ali je niz veljaven JSON?

Pokličite JSON.parse v try/catch ali prilepite besedilo v Oblikovanje in primerjava JSON-a. Če razčlenjevanje vrže SyntaxError, niz ni veljaven JSON.