Tech Help

Proč JSON.parse hlásí "Unexpected token"?

JSON.parse vyhazuje Unexpected token, když text není platný JSON. Odhalte jednoduché uvozovky, koncovou čárku, odpovědi HTML a pozici chyby.

Rychlá odpověď

JSON.parse() vyhazuje SyntaxError, když vstup není platný JSON. „Unexpected token“ obvykle znamená, že parser narazil na znak, který na tom místě struktury není povolen.

Časté příčiny jsou jednoduché uvozovky, koncová čárka, názvy vlastností bez uvozovek, špatný escape řetězce, extra text kolem JSON, nebo parsování HTML či jiného těla, které není JSON, jako by to JSON bylo.

Přesné znění chyby se liší podle motoru JavaScript a prohlížeče. Nepředpokládejte, že každé běhové prostředí tiskne „Unexpected token X in JSON at position N“.

Toto je diagnostika Unexpected token u JSON.parse: co chyba znamená, jak číst pozici a co dělat, když je tělo HTML. Širší pokrytí koncové čárky, uvozovek a Unexpected end je v Běžné chyby JSON: koncová čárka, uvozovky a Unexpected token.

Co znamená “Unexpected token” v JSON.parse()?

JSON.parse() vyžaduje gramatiku JSON. Nelegální znak na aktuální pozici vyhazuje SyntaxError. {“name”:“Alex”,} je neplatný: po té čárce objekt nemůže skončit. Text zprávy a pozice se podle běhového prostředí stále liší.

Jakou chybu vyhazuje JSON.parse()?

Neplatný JSON obvykle vyhazuje SyntaxError. Zalogujte error.name, abyste potvrdili typ. Nekódujte natvrdo celé error.message: motory a verze to formulují jinak.

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

1. Jednoduché uvozovky místo dvojitých

{‘name’:‘Alex’} je neplatný JSON. {“name”:“Alex”} je platný. Řetězce JSON a názvy členů objektu používají dvojité uvozovky. Literál objektu JavaScript jako const user = { name: ‘Alex’ } může být legální JavaScript, a přesto to není text JSON.

Neplatný

{'name':'Alex'}

Platný

{"name":"Alex"}

2. Koncové čárky

Čárka za poslední vlastností nebo poslední položkou pole není platný standardní JSON. {“name”:“Alex”,“age”:30,} i [1, 2, 3,] selžou. Berte to jako jednu příčinu Unexpected token; Běžné chyby JSON: koncová čárka, uvozovky a Unexpected token rozebírá koncové čárky podrobněji.

Neplatný

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

Platný

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

3. Názvy vlastností bez uvozovek

{ name: “Alex” } může být literál objektu JavaScript. V JSON jsou názvy členů řetězce a potřebují dvojité uvozovky: {“name”:“Alex”}.

Neplatný

{
  name: "Alex"
}

Platný

{
  "name": "Alex"
}

4. Neplatný escape řetězce

V textu JSON začíná zpětné lomítko escape. Surová cesta jako C:\Users\Alex je neplatná, protože \U není legální escape. Zdvojte zpětná lomítka. Nemíchejte escape hostitelského jazyka s escape JSON. Běžné chyby JSON: koncová čárka, uvozovky a Unexpected token to rozebírá podrobněji.

Neplatný

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

Platný

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

5. Extra text před JSON nebo za ním

JSON.parse očekává jednu hodnotu JSON. Prefix jako Success: před {“ok”:true}, nebo suffix jako done za ním, činí celý řetězec neplatným. Nevýznamný whitespace kolem jediné hodnoty JSON je povolen. JSON mezery před hodnotou ani za ní nezakazuje.

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

6. Parsování HTML místo JSON

Volání response.json() na stránce HTML je častý případ Unexpected token. Špatné endpointy, HTML stránky 404 nebo 500, přesměrování na přihlášení, těla proxy a záložní stránky často začínají značkami. „Unexpected token < vždy znamená HTML“ je příliš silné: < je nápověda, ne důkaz.

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

Co obvykle znamená “Unexpected token <”?

Hodnoty JSON obvykle nezačínají znakem <. Pokud tělo začíná nebo , může být < první nelegální znak. Při místním ladění zkontrolujte stav HTTP, Content-Type a surové tělo. Znění motoru se stále liší.

Zkontrolujte odpověď, než ji budete parsovat

Tělo z fetch lze spotřebovat jen jednou. Při místním ladění nejdřív přečtěte text(), prohlédněte krátký prefix a teprve pak spusťte JSON.parse na stejném řetězci. Nevolejte response.json() a poté response.text() na téže odpovědi. Ve výchozím stavu nelogujte citlivé produkční zátěž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);
}

Co znamená “at position 123”?

Některé motory hlásí pozici, řádek nebo sloupec. Hledejte poblíž špatnou uvozovku, čárku, závorku nebo escape. Ten index je místo, kde parsování zpozorovalo problém; skutečná příčina může být dřív. Není zaručeno, že jde přesně o vadný znak.

Unexpected token versus Unexpected end

Unexpected token znamená, že parser potkal znak, který nečekal. Unexpected end se může objevit, když vstup skončí dřív, než je hodnota hotová, jako u {“name”:“Alex” bez uzavírací závorky. Přesné znění závisí na motoru. Běžné chyby JSON: koncová čárka, uvozovky a Unexpected token pokrývá neúplný JSON šířeji.

{"name":"Alex"

JSON není totéž co literál objektu JavaScript

JSON je datový formát. Literál objektu JavaScript je syntaxe JavaScript. Objekt JS s klíči bez uvozovek, jednoduchými uvozovkami a koncovou čárkou není platný text JSON. JSON.parse nedokáže bezpečně parsovat literály objektů JavaScript.

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

Může JSON obsahovat komentáře?

Standardní JSON komentáře nepodporuje. Řádek // uvnitř objektu je neplatný. JSON5 a podobná rozšíření jsou jiné formáty. Formátování a porovnání JSON ověřuje standardní JSON pomocí JSON.parse a JSON5 za JSON nepovažuje.

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

Jsou undefined, NaN a Infinity platný JSON?

Ne. Hodnoty JSON jsou objekt, pole, řetězec, číslo, true, false a null. undefined, NaN a Infinity nejsou. Hodnota na nejvyšší úrovni nemusí být objekt ani pole: true, 123, “hello” a null jsou platný JSON.

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

Jak opravit chybu Unexpected token krok za krokem

Pracujte se zdrojem, ne s řetězcem chyby:

  1. Ověřte, že vstup je skutečně JSON, ne HTML, protokoly ani JavaScript.
  2. Prohlédněte první znaky surového vstupu.
  3. Pokud přišel z API, zkontrolujte stav HTTP a Content-Type. Ani 200, ani application/json nezaručují platný JSON.
  4. Ověřte syntaxi v parseru JSON.
  5. Použijte nahlášenou pozici, řádek nebo sloupec jako nápovědu, ne jako zaručenou kořenovou příčinu.
  6. Zkontrolujte uvozovky, čárky, složené závorky, hranaté závorky a escape poblíž té oblasti.
  7. Porovnejte s formátovanou, ověřenou kopií.
  8. Opravte serializátor nebo endpoint. Nemazte nahlášený token naslepo.
Ne „opravujte“ JSON náhodnou výměnou uvozovek

Globální nahrazení ' za " může rozbít apostrofy uvnitř řetězců, už escapovaný text i zdroje, které nejsou JSON. Vytvořte platný JSON ze skutečného serializátoru. Nepovažujte eval za parser JSON.

Při vytváření JSON v JavaScriptu použijte JSON.stringify()

Dejte přednost JSON.stringify před ručním skládáním řetězců. Vydává platný text JSON pro hodnoty, které serializuje. Neuchovává každou hodnotu JavaScript: undefined, funkce a symboly se chovají speciálně. Ten detail je mimo rozsah tohoto textu.

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

Neplatný JSON versus skutečná oprava

Tyto páry byly zkontrolovány pomocí JSON.parse. U HTML je opravou odpověď, ne úprava syntaxe.

Problém Neplatný Oprava
Jednoduché uvozovky {'a':1} {"a":1}
Koncová čárka {"a":1,} {"a":1}
Klíč bez uvozovek {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
Tělo HTML <html>... Zkontrolujte endpoint a surovou odpověď. Neupravujte HTML na JSON.

Jednoduchý rozhodovací návod pro Unexpected token

Když JSON.parse selhal, nejdřív rozhodněte, zda vůbec máte JSON, než začnete přepisovat uvozovky.

  • JSON.parse selhal
  • Z API? Zkontrolujte stav, Content-Type a surové tělo
  • Začíná to jako JSON? Pokud ne, opravte zdroj nebo endpoint
  • Pokud ano, ověřte uvozovky, čárky, závorky, hranaté závorky, escape, nepodporované hodnoty
  • Použijte nahlášenou pozici jako nápovědu
  • Opravte zdroj a parsujte znovu
Unexpected token pojmenovává překvapení. Zdroj textu je často skutečná oprava.

Ověřte JSON, než ho budete parsovat nebo používat

NEXNARA Formátování a porovnání JSON ověřuje JSON v prohlížeči pomocí JSON.parse—ne eval.

Ověřujte, hezky formátujte 2 mezerami, 4 mezerami nebo tabulátorem, minify, kopírujte, stahujte a nahrávejte .json. JSON Diff pokrývá vnořené objekty a pole, cesty, souhrn, filtry a prohození. Po parsování se hezká a minifikovaná kopie týchž dat porovnávají jako stejné; klíče objektu se porovnávají podle názvu.

Text větší než 5 MB může působit pomalu. Text větší než 15 MB se v prohlížeči nezpracovává.

Ověřování a formátování JSON probíhá ve vašem prohlížeči. Tento nástroj JSON na server NEXNARA neodesílá. Reklamy a další funkce webu síť stále používají.

Vložte selhávající řetězec do Formátování a porovnání JSON a přečtěte první znaky, než začnete přepisovat uvozovky.

FAQ

Proč JSON.parse říká Unexpected token?

Text není platný JSON v bodě, kde parser zastavil. Typické příčiny jsou uvozovky, čárky, extra text nebo tělo, které není JSON, například HTML.

Co znamená Unexpected token < in JSON?

První nelegální znak může být <. To často ukazuje na stránku HTML, ale není to důkaz 404 ani HTML v každém případě. Zkontrolujte stav, Content-Type a surové tělo.

Jak najdu pozici chyby v JSON?

Pokud motor nahlásí pozici, řádek nebo sloupec, podívejte se poblíž. Skutečná chyba může být dřív. Použijte to jako nápovědu a pak ověřte.

Může JSON používat jednoduché uvozovky?

Ne. Ve standardním JSON používají řetězce a názvy členů dvojité uvozovky.

Může mít JSON koncové čárky?

Ne. Standardní JSON nepovoluje čárku za poslední vlastností nebo poslední položkou pole.

Jak ověřím, zda je řetězec platný JSON?

Zavolejte JSON.parse v try/catch, nebo vložte text do Formátování a porovnání JSON. Pokud parsování vyhodí SyntaxError, řetězec není platný JSON.