Tři věci, které se často zaměňují
const text = '{"jmeno":"Jana","aktivni":true}'; // JSON text
const literal = { jmeno: 'Jana', aktivni: true }; // zápis objektu v kódu
const value = JSON.parse(text); // objekt v paměti
console.log(value.jmeno); // Jana
console.log(JSON.stringify(literal)); // {"jmeno":"Jana","aktivni":true} Text přeneseš po HTTP nebo uložíš do souboru. Objekt používáš uvnitř programu. JSON.parse() čte text, JSON.stringify() zapisuje hodnotu do textu. Výsledkem parsování může být také pole, číslo, řetězec, boolean nebo null.
Co projde v JavaScriptu, ale není JSON
| Pravidlo | JSON | JavaScript |
|---|---|---|
| Klíče | řetězce ve dvojitých uvozovkách | také identifikátory a vypočtené názvy |
| Řetězce | dvojité uvozovky | také jednoduché uvozovky a šablony |
| Komentáře / koncové čárky | ne / ne | ano / ano |
| undefined, funkce, Symbol | ne | ano |
| NaN, Infinity, BigInt | ne | ano |
{ jmeno: 'Jana', aktivni: true, } {"jmeno":"Jana","aktivni":true} Neopravuj takový text globálním nahrazováním uvozovek. Apostrof může být součástí hodnoty. Pokud máš objekt, použij serializátor; pokud máš JSON5, použij parser daného formátu.
Serializace může změnit nebo odmítnout hodnotu
JSON.stringify({ a: undefined, b: NaN }); // '{"b":null}'
JSON.stringify([undefined, Infinity]); // '[null,null]'
JSON.stringify(undefined); // undefined, žádný JSON text
JSON.stringify(1n); // TypeError
JSON.parse('42'); // 42, nikoli objekt Ve vlastnostech objektu se undefined, funkce a symboly vynechají. V poli se místo nich zapisuje null; stejně se zapisují nečíselné hodnoty NaN a nekonečna. Cyklické odkazy způsobí chybu. Metoda toJSON(), například u Date, může určit jinou reprezentaci.
Proto si před přenosem ujasni datový model. Datum obvykle posílej jako řetězec a velká celá čísla jako řetězce podle kapitoly o číslech. JSON nepřenáší prototyp ani metody objektu.
Časté chyby a bezpečné čtení
- Na JSON používej
JSON.parse(), nikdyeval(). JSON.parse()ověří syntaxi, nikoli obchodní pravidla. Strukturu ověř pomocí JSON Schema.- Hodnota
nullnení chybějící vlastnost; existenci kontroluj pomocíObject.hasOwn(). - Parsování samo nespouští kód, ale následné slučování nedůvěryhodných klíčů do objektů může být nebezpečné.
Rozdíly parserů a pravidla formátu najdeš v syntaxi JSON. Přenositelnost určuje RFC 8259, chování obou funkcí specifikace ECMAScriptu.