JSON vs JavaScript: text, objekt a serializace

JSON je datový formát. Zápis objektu v JavaScriptu je programový kód a objekt po JSON.parse() je hodnota v paměti. Podobný vzhled neznamená stejná pravidla ani stejný význam.

Autor: Aktualizováno

Tři věci, které se často zaměňují

JavaScript
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

PravidloJSONJavaScript
Klíčeřetězce ve dvojitých uvozovkáchtaké identifikátory a vypočtené názvy
Řetězcedvojité uvozovkytaké jednoduché uvozovky a šablony
Komentáře / koncové čárkyne / neano / ano
undefined, funkce, Symbolneano
NaN, Infinity, BigIntneano
Platný object literal, neplatný JSON
{ jmeno: 'Jana', aktivni: true, }
Správně pro přenos dat
{"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

Chování JSON.stringify
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(), nikdy eval().
  • JSON.parse() ověří syntaxi, nikoli obchodní pravidla. Strukturu ověř pomocí JSON Schema.
  • Hodnota null není 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.