Tech Help
Prečo JSON.parse hlási "Unexpected token"?
JSON.parse vyhadzuje Unexpected token, keď text nie je platný JSON. Odhaľte jednoduché úvodzovky, koncovú čiarku, odpovede HTML a pozíciu chyby.
JSON.parse() vyhadzuje SyntaxError, keď vstup nie je platný JSON. „Unexpected token“ zvyčajne znamená, že parser narazil na znak, ktorý na tom mieste štruktúry nie je povolený.
Bežné príčiny sú jednoduché úvodzovky, koncová čiarka, názvy vlastností bez úvodzoviek, zlý escape reťazca, extra text okolo JSON, alebo parsovanie HTML či iného tela, ktoré nie je JSON, ako keby to JSON bolo.
Presné znenie chyby sa líši podľa motora JavaScript a prehliadača. Nepredpokladajte, že každé behové prostredie tlačí „Unexpected token X in JSON at position N“.
Toto je diagnostika Unexpected token pri JSON.parse: čo chyba znamená, ako čítať pozíciu a čo robiť, keď je telo HTML. Širšie pokrytie koncovej čiarky, úvodzoviek a Unexpected end je v Bežné chyby JSON: koncová čiarka, úvodzovky a Unexpected token.
Čo znamená “Unexpected token” v JSON.parse()?
JSON.parse() vyžaduje gramatiku JSON. Nelegálny znak na aktuálnej pozícii vyhadzuje SyntaxError. {“name”:“Alex”,} je neplatný: po tej čiarke objekt nemôže skončiť. Text správy a pozícia sa podľa behového prostredia stále líšia.
Akú chybu vyhadzuje JSON.parse()?
Neplatný JSON zvyčajne vyhadzuje SyntaxError. Zalogujte error.name, aby ste potvrdili typ. Nekódujte natvrdo celé error.message: motory a verzie to formulujú inak.
try {
JSON.parse('{"name":"Alex",}');
} catch (error) {
console.log(error.name);
// SyntaxError
}
1. Jednoduché úvodzovky namiesto dvojitých
{‘name’:‘Alex’} je neplatný JSON. {“name”:“Alex”} je platný. Reťazce JSON a názvy členov objektu používajú dvojité úvodzovky. Literál objektu JavaScript ako const user = { name: ‘Alex’ } môže byť legálny JavaScript, a predsa to nie je text JSON.
Neplatný
{'name':'Alex'}
Platný
{"name":"Alex"}
2. Koncové čiarky
Čiarka za poslednou vlastnosťou alebo poslednou položkou poľa nie je platný štandardný JSON. {“name”:“Alex”,“age”:30,} aj [1, 2, 3,] zlyhajú. Berte to ako jednu príčinu Unexpected token; Bežné chyby JSON: koncová čiarka, úvodzovky a Unexpected token rozoberá koncové čiarky podrobnejšie.
Neplatný
{
"name": "Alex",
"age": 30,
}
Platný
{
"name": "Alex",
"age": 30
}
[1, 2, 3,]
3. Názvy vlastností bez úvodzoviek
{ name: “Alex” } môže byť literál objektu JavaScript. V JSON sú názvy členov reťazce a potrebujú dvojité úvodzovky: {“name”:“Alex”}.
Neplatný
{
name: "Alex"
}
Platný
{
"name": "Alex"
}
4. Neplatný escape reťazca
V texte JSON začína spätné lomítko escape. Surová cesta ako C:\Users\Alex je neplatná, pretože \U nie je legálny escape. Zdvojnásobte spätné lomítka. Nemiešajte escape hostiteľského jazyka s escape JSON. Bežné chyby JSON: koncová čiarka, úvodzovky a Unexpected token to rozoberá podrobnejšie.
Neplatný
{"file":"C:\Users\Alex"}
Platný
{"file":"C:\\Users\\Alex"}
5. Extra text pred JSON alebo za ním
JSON.parse očakáva jednu hodnotu JSON. Prefix ako Success: pred {“ok”:true}, alebo suffix ako done za ním, robí celý reťazec neplatným. Nevýznamný whitespace okolo jedinej hodnoty JSON je povolený. JSON medzery pred hodnotou ani za ňou nezakazuje.
Success:
{"ok":true}
{"ok":true}
done
6. Parsovanie HTML namiesto JSON
Volanie response.json() na stránke HTML je častý prípad Unexpected token. Zlé endpointy, HTML stránky 404 alebo 500, presmerovania na prihlásenie, telá proxy a záložné stránky často začínajú značkami. „Unexpected token < vždy znamená HTML“ je príliš silné: < je nápoveď, nie dôkaz.
fetch('/api/data')
.then(response => response.json())
Čo zvyčajne znamená “Unexpected token <”?
Hodnoty JSON zvyčajne nezačínajú znakom <. Ak telo začína alebo , môže byť < prvý nelegálny znak. Pri miestnom ladení skontrolujte stav HTTP, Content-Type a surové telo. Znenie motora sa stále líši.
Skontrolujte odpoveď, kým ju budete parsovať
Telo z fetch možno spotrebovať len raz. Pri miestnom ladení najprv prečítajte text(), prezrite krátky prefix a až potom spustite JSON.parse na tom istom reťazci. Nevolajte response.json() a potom response.text() na tej istej odpovedi. V predvolenom stave nelogujte citlivé produkčné záťaže.
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);
}
Čo znamená “at position 123”?
Niektoré motory hlásia pozíciu, riadok alebo stĺpec. Hľadajte nablízku zlú úvodzovku, čiarku, zátvorku alebo escape. Ten index je miesto, kde parsovanie spozorovalo problém; skutočná príčina môže byť skôr. Nie je zaručené, že ide presne o chybný znak.
Unexpected token verzus Unexpected end
Unexpected token znamená, že parser stretol znak, ktorý nečakal. Unexpected end sa môže objaviť, keď vstup skončí skôr, než je hodnota hotová, ako pri {“name”:“Alex” bez uzatváracej zátvorky. Presné znenie závisí od motora. Bežné chyby JSON: koncová čiarka, úvodzovky a Unexpected token pokrýva neúplný JSON širšie.
{"name":"Alex"
JSON nie je to isté ako literál objektu JavaScript
JSON je dátový formát. Literál objektu JavaScript je syntax JavaScript. Objekt JS s kľúčmi bez úvodzoviek, jednoduchými úvodzovkami a koncovou čiarkou nie je platný text JSON. JSON.parse nedokáže bezpečne parsovať literály objektov JavaScript.
const data = {
name: 'Alex',
active: true,
};
{
"name": "Alex",
"active": true
}
Môže JSON obsahovať komentáre?
Štandardný JSON komentáre nepodporuje. Riadok // vnútri objektu je neplatný. JSON5 a podobné rozšírenia sú iné formáty. Formátovanie a porovnanie JSON overuje štandardný JSON pomocou JSON.parse a JSON5 za JSON nepovažuje.
{
// user name
"name": "Alex"
}
Sú undefined, NaN a Infinity platný JSON?
Nie. Hodnoty JSON sú objekt, pole, reťazec, číslo, true, false a null. undefined, NaN a Infinity nie sú. Hodnota na najvyššej úrovni nemusí byť objekt ani pole: true, 123, “hello” a null sú platný JSON.
{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null
Ako opraviť chybu Unexpected token krok za krokom
Pracujte so zdrojom, nie s reťazcom chyby:
- Overte, že vstup je skutočne JSON, nie HTML, protokoly ani JavaScript.
- Prezrite prvé znaky surového vstupu.
- Ak prišiel z API, skontrolujte stav HTTP a Content-Type. Ani 200, ani application/json nezaručujú platný JSON.
- Overte syntax v parseri JSON.
- Použite nahlásenú pozíciu, riadok alebo stĺpec ako nápoveď, nie ako zaručenú koreňovú príčinu.
- Skontrolujte úvodzovky, čiarky, zložené zátvorky, hranaté zátvorky a escape nablízku tej oblasti.
- Porovnajte s formátovanou, overenou kópiou.
- Opravte serializátor alebo endpoint. Nemažte nahlásený token naslepo.
Globálne nahradenie ' za " môže rozbiť apostrofy vnútri reťazcov, už escapovaný text aj zdroje, ktoré nie sú JSON. Vytvorte platný JSON zo skutočného serializátora. Nepovažujte eval za parser JSON.
Pri vytváraní JSON v JavaScripte použite JSON.stringify()
Dajte prednosť JSON.stringify pred ručným spájaním reťazcov. Vydáva platný text JSON pre hodnoty, ktoré serializuje. Neuchováva každú hodnotu JavaScript: undefined, funkcie a symboly sa správajú špeciálne. Ten detail je mimo rozsah tohto textu.
const data = {
name: "Alex",
active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}
Neplatný JSON versus skutočná oprava
Tieto páry boli skontrolované pomocou JSON.parse. Pri HTML je opravou odpoveď, nie úprava syntaxe.
| Problém | Neplatný | Náprava |
|---|---|---|
| Jednoduché úvodzovky | {'a':1} |
{"a":1} |
| Koncová čiarka | {"a":1,} |
{"a":1} |
| Kľúč bez úvodzoviek | {a:1} |
{"a":1} |
| undefined | {"a":undefined} |
{"a":null} |
| Telo HTML | <html>... |
Skontrolujte endpoint a surovú odpoveď. Neupravujte HTML na JSON. |
Jednoduchý rozhodovací návod pre Unexpected token
Keď JSON.parse zlyhal, najprv rozhodnite, či vôbec máte JSON, kým začnete prepisovať úvodzovky.
- JSON.parse zlyhal
- Z API? Skontrolujte stav, Content-Type a surové telo
- Začína to ako JSON? Ak nie, opravte zdroj alebo endpoint
- Ak áno, overte úvodzovky, čiarky, zátvorky, hranaté zátvorky, escape, nepodporované hodnoty
- Použite nahlásenú pozíciu ako nápoveď
- Opravte zdroj a parsujte znova
Overte JSON, kým ho budete parsovať alebo používať
NEXNARA Formátovanie a porovnanie JSON overuje JSON v prehliadači pomocou JSON.parse—nie eval.
Overujte, pekne formátujte 2 medzerami, 4 medzerami alebo tabulátorom, minify, kopírujte, sťahujte a nahrávajte .json. JSON Diff pokrýva vnorené objekty a polia, cesty, súhrn, filtre a výmenu. Po parsovaní sa pekná a minifikovaná kópia tých istých dát porovnávajú ako rovnaké; kľúče objektu sa porovnávajú podľa názvu.
Text väčší ako 5 MB môže pôsobiť pomaly. Text väčší ako 15 MB sa v prehliadači nespracúva.
Overovanie a formátovanie JSON prebieha vo vašom prehliadači. Tento nástroj JSON na server NEXNARA neodosiela. Reklamy a ďalšie funkcie webu sieť stále používajú.
Vložte zlyhávajúci reťazec do Formátovanie a porovnanie JSON a prečítajte prvé znaky, kým začnete prepisovať úvodzovky.
FAQ
Prečo JSON.parse hovorí Unexpected token?
Text nie je platný JSON v bode, kde parser zastavil. Typické príčiny sú úvodzovky, čiarky, extra text alebo telo, ktoré nie je JSON, napríklad HTML.
Čo znamená Unexpected token < in JSON?
Prvý nelegálny znak môže byť <. To často ukazuje na stránku HTML, ale nie je to dôkaz 404 ani HTML v každom prípade. Skontrolujte stav, Content-Type a surové telo.
Ako nájdem pozíciu chyby v JSON?
Ak motor nahlási pozíciu, riadok alebo stĺpec, pozrite sa nablízku. Skutočná chyba môže byť skôr. Použite to ako nápoveď a potom overte.
Môže JSON používať jednoduché úvodzovky?
Nie. V štandardnom JSON používajú reťazce a názvy členov dvojité úvodzovky.
Môže mať JSON koncové čiarky?
Nie. Štandardný JSON nepovoľuje čiarku za poslednou vlastnosťou alebo poslednou položkou poľa.
Ako overím, či je reťazec platný JSON?
Zavolajte JSON.parse v try/catch, alebo vložte text do Formátovanie a porovnanie JSON. Ak parsovanie vyhodí SyntaxError, reťazec nie je platný JSON.