Tech Help
Miks JSON.parse ütleb "Unexpected token"?
JSON.parse viskab Unexpected token, kui tekst ei ole kehtiv JSON. Siluge ühekordseid jutumärke, lõpetavaid komasid, HTML-vastuseid ja vea asukohta.
JSON.parse() viskab SyntaxError, kui sisend ei ole kehtiv JSON. „Unexpected token“ tähendab tavaliselt, et parser jõudis märgni, mis selles struktuuri punktis ei ole lubatud.
Levinud põhjused: ühekordsed jutumärgid, lõpetavad komad, jutumärkideta omadusenimed, halb stringi escape, lisatekst JSON-i ümber või HTML-i või muu mitte-JSON keha parsimine JSON-ina.
Täpne veasõnastus erineb JavaScripti mootori ja brauseri järgi. Ärge eeldage, et iga käituskeskkond trükib „Unexpected token X in JSON at position N“.
See on Unexpected tokeni silumine JSON.parse juures: mida viga tähendab, kuidas asukohta lugeda ja mida teha, kui keha on HTML. Laiem käsitlus lõpetavast komast, jutumärkidest ja Unexpected end on Levinud JSON-vead: lõpetav koma, jutumärgid ja Unexpected token.
Mida tähendab “Unexpected token” JSON.parse()-is?
JSON.parse() nõuab JSON-grammatikat. Ebaseaduslik märk praeguses asukohas viskab SyntaxError. {“name”:“Alex”,} on kehtetu: pärast seda koma ei tohi objekt lõppeda. Sõnumi tekst ja asukoht erinevad endiselt runtime’i järgi.
Millise vea JSON.parse() viskab?
Kehtetu JSON viskab tavaliselt SyntaxError. Logige error.name, et kinnitada tüüp. Ärge kõvakoodige kogu error.message: mootorid ja versioonid sõnastavad seda erinevalt.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Ühekordsete jutumärkide kasutamine topeltjutumärkide asemel
{‘name’:‘Alex’} on kehtetu JSON. {“name”:“Alex”} on kehtiv. JSON-stringid ja objekti liikmenimed kasutavad topeltjutumärke. JavaScripti objektiliteraal nagu const user = { name: ‘Alex’ } võib olla seaduslik JavaScript ja ikkagi mitte JSON-tekst.
Kehtetu
{'name':'Alex'}
Kehtiv
{"name":"Alex"}
2. Lõpetavad komad
Koma pärast viimast omadust või massiivi elementi ei ole kehtiv standard-JSON. {“name”:“Alex”,“age”:30,} ja [1, 2, 3,] mõlemad nurjuvad. Kohelge seda ühe Unexpected tokeni põhjusena; Levinud JSON-vead: lõpetav koma, jutumärgid ja Unexpected token käsitleb lõpetavaid komasid sügavamalt.
Kehtetu
{
"name": "Alex",
"age": 30,
}
Kehtiv
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Jutumärkideta omadusenimed
{ name: “Alex” } võib olla JavaScripti objektiliteraal. JSON-is on objekti liikmenimed stringid ja vajavad topeltjutumärke: {“name”:“Alex”}.
Kehtetu
{
name: "Alex"
}
Kehtiv
{
"name": "Alex"
}
4. Kehtetu stringi escape
JSON-tekstis alustab kaldkriips escape’i. Toortee nagu C:\Users\Alex on kehtetu, sest \U ei ole seaduslik escape. Kahekordistage kaldkriipsud. Ärge segage peremeeskeele escape’i JSON-escape’iga. Levinud JSON-vead: lõpetav koma, jutumärgid ja Unexpected token käsitleb seda sügavamalt.
Kehtetu
{"file":"C:\Users\Alex"}
Kehtiv
{"file":"C:\\Users\\Alex"}
5. Lisatekst enne JSON-i või pärast seda
JSON.parse ootab ühte JSON-väärtust. Eesliide nagu Success: enne {“ok”:true} või järelliide nagu done pärast seda muudab kogu stringi kehtetuks. Ebaoluline tühik ühe JSON-väärtuse ümber on lubatud. JSON ei keela tühikuid väärtuse ees ega järel.
Success:
{"ok":true}
{"ok":true}
done
6. HTML-i parsimine JSON-i asemel
response.json() kutsumine HTML-lehel on sage Unexpected tokeni juhtum. Valed endpointid, 404 või 500 HTML-lehed, sisselogimise ümbersuunamised, puhvri kehad ja varulehed algavad sageli märgistusega. „Unexpected token < tähendab alati HTML-i“ on liiga tugev: < on vihje, mitte tõend.
fetch('/api/data')
.then(response => response.json())
Mida “Unexpected token <” tavaliselt tähendab?
JSON-väärtused ei alga tavaliselt märgiga <. Kui keha algab või -iga, võib < olla esimene ebaseaduslik märk. Kohalikus silumises kontrollige HTTP-olekut, Content-Type ja toorkeha. Mootori sõnastus erineb endiselt.
Kontrollige vastust enne parsimist
fetch keha saab tarbida ainult üks kord. Kohalikus silumises lugege esmalt text(), vaadake lühikest eesliidet, seejärel JSON.parse sama stringi. Ärge kutsuge response.json() ja seejärel response.text() samale vastusele. Ärge logige vaikimisi tundlikke tootmiskoormusi.
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);
}
Mida tähendab “at position 123”?
Mõned mootorid teatavad asukoha, rea või veeru. Otsige lähedalt halba jutumärki, koma, sulgu või escape’i. See indeks on, kus parsimine märkas probleemi; tegelik põhjus võib olla varem. See ei ole garantii, et tegu on täpselt riknenud märgiga.
Unexpected token versus Unexpected end
Unexpected token tähendab, et parser kohtas märki, mida ta ei oodanud. Unexpected end võib ilmuda, kui sisend peatub enne, kui väärtus on täielik, nagu {“name”:“Alex” ilma sulgeva looksuluta. Täpne sõnastus sõltub mootorist. Levinud JSON-vead: lõpetav koma, jutumärgid ja Unexpected token käsitleb puudulikku JSON-i laiemalt.
{"name":"Alex"
JSON ei ole sama mis JavaScripti objektiliteraal
JSON on andmevorming. JavaScripti objektiliteraal on JavaScripti süntaks. JS-objekt jutumärkideta võtmete, ühekordsete jutumärkide ja lõpetava komaga ei ole kehtiv JSON-tekst. JSON.parse ei saa JavaScripti objektiliteraale ohutult parsida.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
Kas JSON võib sisaldada kommentaare?
Standard-JSON ei toeta kommentaare. Rida // objekti sees on kehtetu. JSON5 ja sarnased laiendid on teised vormingud. JSON-i vormindamine ja võrdlus kontrollib standard-JSON-i JSON.parse-iga ega käsitle JSON5 JSON-ina.
{
// user name
"name": "Alex"
}
Kas undefined, NaN ja Infinity on kehtiv JSON?
Ei. JSON-väärtused on objekt, massiiv, string, arv, true, false ja null. undefined, NaN ja Infinity ei ole. Tipptaseme väärtus ei pea olema objekt ega massiiv: true, 123, “hello” ja null on kehtiv JSON.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Kuidas Unexpected tokeni viga samm-sammult parandada
Töötage allikaga, mitte veastringiga:
- Kinnitage, et sisend on tegelikult JSON, mitte HTML, logid või JavaScript.
- Vaadake toorsisendi esimesi märke.
- Kui see tuli API-st, kontrollige HTTP-olekut ja Content-Type. Ei 200 ega application/json ei garanteeri kehtivat JSON-i.
- Kontrollige süntaksit JSON-parseris.
- Kasutage teatatud asukohta, rida või veergu vihjena, mitte garanteeritud juurpõhjusena.
- Kontrollige jutumärke, komasid, looksulge, nurksulge ja escape’e selle piirkonna lähedal.
- Võrrelge vormindatud, kontrollitud koopiaga.
- Parandage serialiseerija või endpoint. Ärge kustutage teatatud tokenit juhuslikult.
Globaalne ' asendamine "-ga võib rikkuda ülakomasid stringides, juba escape'itud teksti ja allikaid, mis ei ole JSON. Tootke kehtiv JSON tegelikust serialiseerijast. Ärge käsitlege eval JSON-parserina.
Kasutage JSON.stringify() JSON-i tootmisel JavaScriptis
Eelistage JSON.stringify käsitsi stringide ühendamisele. See väljastab kehtiva JSON-teksti väärtustele, mida serialiseerib. See ei säilita iga JavaScripti väärtust: undefined, funktsioonidel ja sümbolitel on eriline käitumine. See detail jääb siin ulatusest välja.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
Kehtetu JSON versus tegelik parandus
Need paarid kontrolliti JSON.parse-iga. HTML-i puhul on parandus vastus, mitte süntaksiredigeerimine.
| Probleem | Kehtetu | Parandus |
|---|---|---|
| Ühekordsed jutumärgid | {'a':1} |
{"a":1} |
| Lõpetav koma | {"a":1,} |
{"a":1} |
| Jutumärkideta võti | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| HTML-keha | <html>... |
Kontrollige endpointi ja toorvastust. Ärge redigeerige HTML-i JSON-iks. |
Lihtne Unexpected tokeni otsustusjuhend
Kui JSON.parse nurjus, otsustage enne jutumärkide ümberkirjutamist, kas teil üldse on JSON.
- JSON.parse nurjus
- API-st? Kontrollige olekut, Content-Type ja toorkeha
- Kas algab JSON-ina? Kui ei, parandage allikas või endpoint
- Kui jah, kontrollige jutumärke, komasid, looksulge, nurksulge, escape'e, toetamata väärtusi
- Kasutage teatatud asukohta vihjena
- Parandage allikas, seejärel parsige uuesti
Kontrollige JSON-i enne parsimist või kasutamist
NEXNARA JSON-i vormindamine ja võrdlus kontrollib JSON-i brauseris JSON.parse-iga—mitte eval.
Kontroll, ilus vormindus 2 tühiku, 4 tühiku või tabeldusmärkidega, minify, kopeerimine, allalaadimine ja .json üleslaadimine. JSON Diff hõlmab pesastatud objekte ja massiive, teid, kokkuvõtet, filtreid ja vahetust. Pärast parsimist võrreldakse samade andmete ilusat ja minify koopiat võrdsetena; objekti võtmeid võrreldakse nime järgi.
Tekst, mis on suurem kui 5 MB, võib tunduda aeglane. Teksti, mis on suurem kui 15 MB, brauseris ei töödelda.
JSON-i kontroll ja vormindus toimuvad teie brauseris. See tööriist ei saada JSON-i NEXNARA serverisse. Reklaamid ja muud saidi funktsioonid kasutavad endiselt võrku.
Kleepige nurjuv string JSON-i vormindamine ja võrdlus ja lugege esimesed märgid enne jutumärkide ümberkirjutamist.
FAQ
Miks JSON.parse ütleb Unexpected token?
Tekst ei ole kehtiv JSON punktis, kus parser peatus. Tüüpilised põhjused on jutumärgid, komad, lisatekst või mitte-JSON keha, näiteks HTML.
Mida tähendab Unexpected token < in JSON?
Esimene ebaseaduslik märk võib olla <. See osutab sageli HTML-lehele, kuid ei ole 404 ega HTML-i tõend igal juhul. Kontrollige olekut, Content-Type ja toorkeha.
Kuidas leida vea asukoht JSON-is?
Kui mootor teatab asukoha, rea või veeru, vaadake lähedalt. Tegelik viga võib olla varem. Kasutage seda vihjena, seejärel kontrollige.
Kas JSON võib kasutada ühekordseid jutumärke?
Ei. Standard-JSON-is kasutavad stringid ja liikmenimed topeltjutumärke.
Kas JSON-il võivad olla lõpetavad komad?
Ei. Standard-JSON ei luba koma pärast viimast omadust või massiivi elementi.
Kuidas kontrollida, kas string on kehtiv JSON?
Kutsuge JSON.parse try/catch-is või kleepige tekst JSON-i vormindamine ja võrdlus. Kui parsimine viskab SyntaxError, ei ole string kehtiv JSON.