JSON
Obsah boxu
JSON (akronym pro JavaScript Object Notation) je textový, na člověku čitelný datový formát určený pro výměnu dat mezi systémy. Ačkoliv vychází z podmnožiny programovacího jazyka JavaScript, je na jazyku zcela nezávislý a existují pro něj parsovací knihovny pro většinu programovacích jazyků. Díky své jednoduchosti, čitelnosti a snadné strojové zpracovatelnosti se stal de facto standardem pro webová API a konfigurační soubory.
📜 Historie a původ
Formát JSON navrhl a popularizoval Douglas Crockford na začátku 21. století. Crockford a jeho kolegové ve společnosti State Software hledali způsob, jak vytvořit stavovou, na prohlížeči nezávislou webovou aplikaci, která by komunikovala se serverem bez nutnosti používat Flash nebo Java applety, což byly tehdy dominantní technologie pro bohaté internetové aplikace.
Objevili, že JavaScript v tehdejších prohlížečích (konkrétně Internet Explorer 5) měl vestavěnou schopnost interpretovat literály objektů a polí. Tuto vlastnost využili k přenosu dat ze serveru do klienta, čímž obešli složitost parsování XML. Tento přístup byl výrazně jednodušší a efektivnější.
Crockford zaregistroval doménu `json.org` v roce 2002 a zveřejnil specifikaci formátu. Díky své jednoduchosti a přímé podpoře v JavaScriptu si JSON rychle získal popularitu, zejména s nástupem AJAX a webových aplikací, které intenzivně komunikovaly se serverem na pozadí. Formát byl později formalizován a standardizován v dokumentech RFC 4627 (zastaralý), RFC 7159 (zastaralý) a nejnověji v RFC 8259 a standardu ECMA-404.
⚙️ Syntaxe a datové typy
Syntaxe JSON je velmi striktní, ale zároveň minimalistická. Je založena na dvou základních strukturách a šesti základních datových typech.
🧱 Základní stavební kameny
- Objekt: Neuspořádaná kolekce párů klíč-hodnota. Objekt začíná a končí složenou závorkou (`{}`). Každý pár se skládá z klíče (což je vždy řetězec v uvozovkách), následovaného dvojtečkou (`:`) a hodnotou. Jednotlivé páry jsou odděleny čárkou (`,`).
- Příklad objektu:*
{
"jmeno": "Jan",
"prijmeni": "Novák",
"vek": 30,
"jeAktivni": true
}
- Pole (Array): Uspořádaný seznam hodnot. Pole začíná a končí hranatou závorkou (`[]`). Hodnoty v poli jsou odděleny čárkami (`,`). Hodnoty v poli mohou být různých datových typů.
- Příklad pole:*
[ "jablko", "hruška", "banán" ]
🏷️ Datové typy
JSON podporuje šest základních datových typů:
- Řetězec (String): Sekvence Unicode znaků uzavřená v dvojitých uvozovkách (`"`). Podporuje escape sekvence pro speciální znaky (např. `\n` pro nový řádek, `\"` pro uvozovku).
- Číslo (Number): Celočíselné nebo desetinné číslo. Nepodporuje oktalový nebo hexadecimální formát. Může obsahovat znaménko (`-`) a exponent (`e` nebo `E`).
- Boolean (Boolean): Logická hodnota, která může být buď `true` (pravda) nebo `false` (nepravda).
- Pole (Array): Uspořádaný seznam hodnot, jak je popsáno výše.
- Objekt (Object): Neuspořádaná kolekce párů klíč-hodnota, jak je popsáno výše.
- Null (Null): Speciální hodnota reprezentující prázdnou nebo neexistující hodnotu. Zapisuje se jako `null`.
✅ Výhody a nevýhody
👍 Výhody
- Lidská čitelnost: Syntaxe je jednoduchá a snadno čitelná i pro lidi bez hlubších technických znalostí.
- Snadné parsování: Pro stroje je formát velmi snadno a rychle parsovatelný. Většina programovacích jazyků má vestavěné nebo snadno dostupné knihovny pro práci s JSON.
- Jazyková nezávislost: Ačkoliv vychází z JavaScriptu, není na něm závislý a je podporován prakticky všemi moderními programovacími jazyky.
- Rozšířenost: Stal se de facto standardem pro REST API, což usnadňuje integraci mezi různými systémy a službami.
- Přímá podpora v JavaScriptu: V JavaScriptu lze JSON snadno převést na nativní objekty pomocí `JSON.parse()` a naopak pomocí `JSON.stringify()`.
👎 Nevýhody
- Chybějící komentáře: Specifikace JSON neumožňuje vkládání komentářů. To může ztížit dokumentaci konfiguračních souborů přímo v kódu.
- Omezené datové typy: JSON nemá nativní podporu pro některé běžné datové typy, jako je datum a čas. Ty se obvykle ukládají jako řetězce ve formátu ISO 8601.
- Striktní syntaxe: I drobná chyba, jako je chybějící čárka nebo uvozovka, způsobí neplatnost celého dokumentu.
- Vyšší datový objem: Oproti binárním formátům (jako Protocol Buffers nebo MessagePack) je JSON "upovídanější" a zabírá více místa, což může být nevýhoda při přenosu velkého množství dat.
🔄 Porovnání s jinými formáty
🆚 XML
XML (Extensible Markup Language) byl dlouhou dobu dominantním formátem pro výměnu dat.
- Syntaxe: XML používá značky (tagy) pro definici struktury, podobně jako HTML. JSON používá páry klíč-hodnota a pole.
- Velikost: JSON je obecně méně "ukecaný" než XML, protože nevyžaduje uzavírací tagy pro každý prvek.
- Parsování: Parsování JSON je v JavaScriptu a mnoha dalších jazycích jednodušší a rychlejší než parsování XML, které často vyžaduje DOM parser.
- Rozšiřitelnost: XML je silnější v oblastech, kde je potřeba definovat jmenné prostory (namespaces) nebo používat atributy u elementů, což JSON nepodporuje.
🆚 YAML
YAML (YAML Ain't Markup Language) je další formát zaměřený na lidskou čitelnost.
- Syntaxe: YAML používá k definici struktury odsazení (podobně jako Python) a je méně striktní na používání závorek a uvozovek. JSON je podmnožinou YAML, takže validní JSON je obvykle i validní YAML.
- Čitelnost: Pro mnoho lidí je YAML čitelnější, zejména u složitých konfiguračních souborů.
- Funkce navíc: YAML podporuje komentáře, kotvy (anchors) pro znovupoužití částí dokumentu a více datových typů.
- Použití: YAML je velmi populární pro konfigurační soubory (např. v Dockeru nebo Kubernetes), zatímco JSON dominuje v oblasti API.
💡 Použití v praxi
🌐 Webové API
JSON je nejpoužívanějším formátem pro přenos dat v RESTful API. Klient (např. webový prohlížeč nebo mobilní aplikace) pošle HTTP požadavek na server a server odpoví daty ve formátu JSON.
📄 Konfigurační soubory
Mnoho aplikací a vývojářských nástrojů používá JSON pro ukládání konfigurace. Typickým příkladem je soubor `package.json` v ekosystému Node.js, který obsahuje metadata o projektu a jeho závislostech. Dalším příkladem je konfigurační soubor `tsconfig.json` pro TypeScript.
🗄️ NoSQL databáze
Dokumentově orientované NoSQL databáze, jako je MongoDB nebo CouchDB, ukládají data v dokumentech, které se velmi podobají formátu JSON (např. MongoDB používá binární variantu nazvanou BSON). To umožňuje flexibilní a dynamická schémata dat.
🛡️ Bezpečnostní aspekty
Ačkoliv je JSON sám o sobě bezpečný datový formát, jeho nesprávné zpracování může vést k bezpečnostním zranitelnostem. V raných dobách AJAXu bylo běžné parsovat JSON v JavaScriptu pomocí nebezpečné funkce `eval()`. To otevíralo dveře pro útoky typu Cross-site scripting (XSS), pokud JSON obsahoval škodlivý kód.
Moderní prohlížeče a knihovny používají bezpečnější metodu `JSON.parse()`, která zpracovává pouze data a nespouští žádný kód. Při vkládání dat z JSON do HTML stránky je stále klíčové správně ošetřit (escapovat) všechny vstupy, aby se předešlo XSS útokům.
📚 Standardizace
Oficiální specifikace formátu JSON je udržována několika standardizačními orgány:
- ECMA-404: The JSON Data Interchange Standard. Poskytuje stručnou a formální definici formátu.
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format. Tento dokument od IETF je hlavním internetovým standardem, který popisuje JSON, jeho syntaxi, kódování znaků (UTF-8) a bezpečnostní doporučení.
🤓 Pro laiky
Představte si JSON jako digitální nákupní seznam nebo vizitku.
- **Vizitka (Objekt):** Vizitka má různé popisky (klíče) a k nim příslušné informace (hodnoty). Například:
* `"jméno": "Tomáš Marný"`
* `"firma": "GigaCorp"`
* `"telefon": "123 456 789"`
Celá vizitka je jeden "objekt" uzavřený ve složených závorkách `{}`. Každý popisek (klíč) je v uvozovkách.
- **Nákupní seznam (Pole):** Nákupní seznam je prostě seznam položek v určitém pořadí.
* `[ "mléko", "chleba", "vajíčka", "máslo" ]` Celý seznam je "pole" uzavřené v hranatých závorkách `[]`.
JSON umožňuje tyto dva typy záznamů kombinovat. Můžete mít například seznam vizitek (pole objektů) nebo vizitku, kde jednou z položek je seznam koníčků (objekt obsahující pole). Je to jednoduchý a organizovaný způsob, jak si počítače předávají strukturované informace.