Rozbíjí BOM parsování JSON
Shrnutí: UTF-8 BOM jsou tři neviditelné bajty, takže `JSON.parse` selže už na prvním znaku a hlásí řádek 1, sloupec 1, což soubor nechá vypadat prázdný nebo zkrácený.

Stručně: zkontrolujte první tři bajty na EF BB BF a uložte znovu jako UTF-8 bez BOM; na serveru odstraňte úvodní U+FEFF před parsováním jakéhokoli nahraného nebo cizího souboru, místo abyste poruchu ladili později.
Ano – a vytváří nejmatoucí ze všech chyb parsování, protože soubor vypadá naprosto v pořádku.
Co vidíte
SyntaxError: Unexpected token in JSON at position 0
Unexpected character '\uFEFF'
Ten znak ve zprávě je neviditelný. Pozice 0 znamená úplně první bajt.
cat neukazuje nic neobvyklého. hexdump -C file.json | head -1 ano:
00000000 ef bb bf 7b 0a 20 20 22 61 22 3a 20 31 0a 7d 0a |...{ "a": 1.}.|
7b je {. Tři bajty před ním jsou BOM.
Odkud BOM pochází
Byte order mark existoval pro UTF-16, kde se pořadí bajtů skutečně lišilo. UTF-8 má jediné pořadí bajtů, takže BOM je čistá režie – přesto ho Poznámkový blok ve Windows, některé exporty z Excelu a několik starších IDE stále zapisují ve výchozím nastavení.
RFC 8259 je jednoznačný: JSON vyměňovaný mezi systémy musí být UTF-8 a implementace nesmějí přidávat BOM. Parsery smějí úvodní BOM ignorovat, ale nejsou povinny. Prohlížeče a Node se rozhodly neignorovat.
Tři způsoby, jak se ho zbavit
Uložte bez BOM. Ve VS Code klikněte na kódování ve stavovém řádku a vyberte „Save with Encoding → UTF-8“, nikoli „UTF-8 with BOM“.
Odstraňte ho ze shellu.
sed -i '1s/^\xEF\xBB\xBF//' data.json
Odstraňte ho při čtení. Toto je trvalá oprava pro cokoli, co přijímá nahrané nebo cizí soubory:
const text = require('node:fs').readFileSync('data.json', 'utf8').replace(/^\uFEFF/, '');
JSON.parse(text);
V Pythonu to open(path, encoding='utf-8-sig') zvládne automaticky.
Dva podobně vypadající problémy
- Mezera s nulovou šířkou (U+200B) – přichytí se při kopírování JSON z webové stránky; stejný příznak, jiný kódový bod.
- Celošířkové uvozovky – čínský IME změní
"key"na“key”, což vypadá téměř stejně, ale selže jakoUnexpected token “.
Všechny tři jsou chyby neviditelných znaků. Diagnostika je vždy stejná: vypište první bajty hexadecimálně, místo abyste zírali na text.
Časté dotazy
Jak zjistit, zda soubor začíná BOM?
cat neukazuje nic, takže spusťte hexdump -C file.json | head -1. Pokud výstup začíná ef bb bf, soubor má BOM; v čistém UTF-8 souboru má být první 7b (tedy {).
Proč chyba vždy ukazuje na řádek 1, sloupec 1?
BOM sedí před vším ostatním, takže první znak, který parser přečte, je U+FEFF. Selhání tedy přistane na začátku souboru, což soubor nechá vypadat prázdný.
Mám BOM odstranit před parsováním?
Ano. Když server čte konfiguraci nebo parsuje nahrané soubory, nejprve odstraňte úvodní U+FEFF – replace(/^\uFEFF/, '') v Node, encoding='utf-8-sig' v Pythonu – což je mnohem levnější než pozdější diagnostika.