Znění hlášky v jednotlivých prostředích
Hlášky pocházejí z konkrétních parserů, nejsou to názvy chyb z normy. Stejná chyba proto v Chromu, Firefoxu, Pythonu nebo .NET zní jinak:
Znak v apostrofech ('<', 'N') a pozice ukazují, kde parser skončil.
Pozice 0 nebo řádek 1, sloupec 1 znamená, že vstup není JSON už od začátku. PHP hlásí u většiny
syntaktických chyb jen Syntax error a místo neuvádí. Polohu najdeš ve
validátoru.
Příčiny a opravy
Server vrátil HTML místo JSON
{"jmeno": "Eva"}
Znak < na začátku znamená HTML: stránku 404 nebo 500, přesměrování na
přihlášení, nebo vývojový server, který na neznámou cestu vrací index.html.
response.json() pak selže, i když je chyba ve skutečnosti v URL nebo
v oprávnění. Před čtením JSON zkontroluj stavový kód a Content-Type:
async function getJson(url) {
const response = await fetch(url);
const type = response.headers.get('content-type') ?? '';
if (!response.ok || !/\bjson\b/.test(type)) {
// Ukaž, co server doopravdy poslal, místo SyntaxError z response.json().
throw new Error(`${response.status} ${type}: ${(await response.text()).slice(0, 200)}`);
}
return response.json();
}
Podmínka \bjson\b propustí application/json i typy jako
application/problem+json. Typy médií pro JSON a XML jsou v
referenci MIME typů.
Klíč bez uvozovek (zápis objektu z JavaScriptu)
{"jmeno": "Eva"}
JSON není zápis objektu z JavaScriptu. Názvy vlastností musí být řetězce v dvojitých
uvozovkách, undefined ani komentáře nejsou povolené. Rozdíly popisuje
JSON vs JavaScript.
Apostrofy místo dvojitých uvozovek
{"jmeno":"Eva"}
Pro výrobu JSON použij serializátor (JSON.stringify, json.dumps).
Globální nahrazení apostrofů zničí například jméno O’Connor nebo text s uvozovkami, oprava
musí vycházet z původní datové struktury.
Jak najít příčinu
Nejprve ověř celé vstupní tělo: vypiš ho jako text, ne až jako výsledek parseru. Pokud jsi
získal HTTP odpověď, zkontroluj status a Content-Type. Neopravuj nesprávný formát
pomocí eval.
Přesné znění, pozice a délka hlášky závisí na parseru a verzi. Pozice obvykle označuje místo, kde parser problém odhalil, ne vždy začátek příčiny.
Neviditelný BOM a komentáře
{
// Poznámka pro autora
"jmeno":"Eva"
} Odstraň komentář nebo zvol rozšířený formát jen tehdy, když jej příjemce výslovně podporuje. Pokud parser selže na prvním znaku, zkontroluj také skutečné bajty: UTF-8 BOM je EF BB BF. RFC 8259 zakazuje jeho přidání do přenášeného JSON, parser jej však může tolerovat. Ulož vlastní soubor jako UTF-8 bez BOM; porovnání chování parserů a opravu v Pythonu najdeš v kapitole kódování JSON. Neodstraňuj libovolné znaky uvnitř dat.