JSON je dnes natolik běžný, že jeho volbu téměř nevnímáme. Prohlížeče posílají JSON requesty, mobilní aplikace čtou JSON odpovědi a stejný zápis se objevuje v konfiguraci, událostech i logování. Formát nezvítězil nejbohatším typovým systémem. Nabídl malou sadu pravidel, čitelnost pro člověka, blízkost objektům JavaScriptu a jednoduché knihovny pro prakticky každý programovací jazyk.

Datový model je malý a snadno rozpoznatelný

Objekt obsahuje pojmenované vlastnosti, pole uspořádané hodnoty. Dále existují stringy, čísla, true, false a null. Většinu běžných requestů a odpovědí lze vyjádřit bez složitého dokumentového modelu.

Jednoduchost ale znamená, že význam zůstává ve smlouvě API. JSON sám neřekne, zda číslo představuje cenu, dobu nebo identifikátor. Neurčuje povinná pole ani vzájemné podmínky. To musí zajistit schema, dokumentace a validace.

JavaScript poskytl přirozený začátek

Zápis připomíná literály objektů a polí v JavaScriptu. Rané webové aplikace proto mohly serverová data převést na známé struktury bez rozsáhlých XML nástrojů. Standardní JSON.parse a JSON.stringify později vytvořily bezpečnou hranici.

JSON není spustitelný program. Staré použití eval bylo nebezpečné a dnes je zbytečné. Parser má přijmout pouze datovou syntaxi, nikoli kód poslaný vzdáleným systémem.

Oproti XML vyžadoval méně obřadnosti

XML nabízí namespaces, atributy, smíšený obsah, vyspělé schemas a dokumentové nástroje. Pro mnoho API však šlo o širší model, než potřebovala. JSON zapisoval seznamy a aplikační záznamy s menším množstvím markup.

XML tím neztratilo všechny vhodné případy. Oborové standardy, dlouhodobé dokumenty a některé podpisové protokoly z jeho vlastností těží. JSON převládl hlavně při přenosu běžných strukturovaných dat.

HTTP a JSON řeší různé vrstvy

HTTP poskytuje metodu, status, hlavičky, cache a content negotiation. JSON popisuje tělo. Kvalitní API používá obojí: stavový kód vyjadřuje výsledek protokolu, Content-Type formát a JSON doménová data nebo strukturovanou chybu.

Vrátit vždy 200 s polem success zahazuje význam HTTP. Samotný status zase nevysvětlí chyby jednotlivých polí. Obě vrstvy se mají doplňovat.

Ekosystém odstranil velkou část integrační ceny

Parser JSON existuje v každém rozšířeném jazyce, HTTP klientu, testovacím frameworku a prohlížečovém nástroji. Tato dostupnost se sama posiluje: nový tým zvolí JSON kvůli nástrojům a vytvoří další důvod podporovat jej.

Implementace se přesto liší u velkých čísel, duplicitních klíčů a neplatného Unicode. Interoperabilní API má definovat užší profil než „libovolný JSON, který nějaká knihovna přijme“.

Čitelnost pomáhá vývoji i provozu

Odpověď lze otevřít v DevTools, curl nebo logu. Názvy polí přenášejí význam a nesting ukazuje vztahy. Veřejné API je díky tomu snazší poprvé pochopit a ladit.

Plné payloady však nemají automaticky patřit do produkčních logů. Čitelný dokument může obsahovat tokeny a osobní údaje. Redakce, přístup a retention jsou stále nutné.

Textový zápis má výkonovou cenu

Názvy vlastností se opakují, čísla cestují jako desítkový text a binární data potřebují Base64. Pro velmi vysoký throughput mohou být Protobuf, Avro nebo MessagePack menší a typově přesnější.

U veřejného rozhraní může být transparentnost důležitější než několik procent přenosu. Mezi interními službami s miliony zpráv za sekundu už binární formát může přinést významnou úsporu.

Čísla jsou známá interoperabilitní past

JSON formálně nerozlišuje integer a floating point. JavaScript Number nepřesně reprezentuje část 64bitových identifikátorů. Backend odešle správné ID a klient jej tiše zaokrouhlí.

Velké identifikátory je často vhodné posílat jako string. Peníze potřebují dohodnutou podobu, například integer nejmenších jednotek nebo desetinný string. Platná syntaxe sama nezachovává přesný význam.

Datum a čas potřebují vlastní konvenci

JSON nemá datový typ pro datum. String 2026-06-06 může být kalendářní den, zatímco timestamp označuje okamžik. Epoch číslo bez jednotky neříká, zda jde o sekundy nebo milisekundy.

API má uvést formát, offset a význam. Narozeniny se nesmějí posunout při převodu zóny a okamžik události nemá cestovat jako lokální čas bez kontextu.

Null a chybějící pole nejsou totéž

Nepřítomná vlastnost může znamenat „nenačteno“, „neměnit“ nebo „použít default“. Null může znamenat explicitní vymazání. Prázdný string či pole zase představuje existující prázdnou hodnotu.

Rozdíl je kritický u PATCH requestů a částečných odpovědí. Schema má optional a nullable popsat odděleně.

Snadný parsing neznamená bezpečné zpracování

Obrovské stringy, hluboký nesting a dlouhá pole mohou vyčerpat paměť nebo zásobník. Server potřebuje limity body, hloubky a počtu prvků. Po parsování následuje schema a authorization.

Syntakticky validní dokument je pouze datová struktura. Nedokazuje oprávnění ani platnost doménové operace.

Media type může pojmenovat konkrétní reprezentaci

application/json popisuje syntaxi, nikoli doménovou smlouvu. Vlastní media type nebo jednoznačný endpoint může vyjádřit konkrétní resource model a případnou verzi. Content negotiation je užitečné, když stejný zdroj vědomě nabízí několik reprezentací, ne jako náhrada dokumentace.

Klient má kontrolovat Content-Type dříve, než spustí JSON parser. HTML error page se tak nestane matoucí syntaktickou chybou.

Streaming parser pomáhá pouze u vhodného tvaru

Velké pole na top-level může být zpracováváno postupně, pokud knihovna a business logic nepotřebují celý dokument. Běžný DOM parser však často vše materializuje. Pro dlouhé proudy událostí může být vhodnější NDJSON nebo framing.

Formát se má vybírat podle způsobu zpracování, ne jen podle toho, zda je technicky validní JSON.

JSON uspěl jako praktický společný základ

Nabízí dost struktury pro běžné aplikace a málo pravidel pro levnou implementaci. JavaScript mu pomohl na začátku, ale trvalou výhodou se stala podpora napříč ekosystémem.

Dobré API doplní JSON o schema, velikostní limity, časové a číselné konvence a správnou HTTP sémantiku. Formát je lehký základ, nikoli úplný návrh rozhraní.