====== JSON ====== **JSON** (z anglického **JavaScript Object Notation**) je lehký, textový a člověkem čitelný formát pro výměnu a ukládání strukturovaných dat. Původně vznikl jako podmnožina jazyka JavaScript, dnes je však **nezávislý na jakémkoli programovacím jazyce** a podporován téměř všemi moderními technologiemi. JSON se často používá pro: * komunikaci mezi klientem a serverem (např. v REST API), * konfigurační soubory, * ukládání nestrukturovaných nebo polostrukturovaných dat (např. v NoSQL databázích jako MongoDB). ===== Syntaxe a datové typy ===== JSON podporuje následující základní datové typy: * **String** – text uzavřený v **dvojitých uvozovkách**: `"Ahoj"` * **Number** – celá nebo desetinná čísla (bez uvozovek): `42`, `-3.14`, `1.23e5` * **Boolean** – logické hodnoty: `true`, `false` * **Null** – prázdná hodnota: `null` * **Object** – neuspořádaná množina dvojic klíč–hodnota (tzv. „mapa“ nebo „slovník“), uzavřená do složených závorek `{}`. * **Array** – uspořádaný seznam hodnot, uzavřený do hranatých závorek `[]`. ❗ **Důležité**: V JSON **musí být vždy použity dvojité uvozovky** (`"`). Jednoduché uvozovky (`'`) nejsou platné. ===== Příklad JSON dokumentu ===== { "jmeno": "Jan", "prijmeni": "Novák", "vek": 32, "student": false, "email": null, "konicky": ["čtení", "běhání", "programování"], "adresa": { "ulice": "Náměstí Míru 123", "mesto": "Praha", "psc": "110 00", "zeme": "Česká republika" } } ===== Pravidla syntaxe JSON ===== * Klíče (názvy vlastností) **musí být řetězce v dvojitých uvozovkách**. * Hodnoty mohou být libovolného platného JSON typu. * Čárky oddělují jednotlivé prvky (v poli) nebo dvojice klíč–hodnota (v objektu). * **Na konci posledního prvku v objektu nebo poli nesmí být čárka** (tzv. „trailing comma“ – není v základním JSON povolena, i když některé knihovny ji tolerují). * Komentáře **nejsou v oficiálním JSON standardu podporovány**. Nesprávný JSON (běžné chyby): { 'jmeno': 'Jan', // ❌ Jednoduché uvozovky vek: 32, // ❌ Klíč bez uvozovek konicky: ["a", "b",], // ❌ Čárka na konci pole // komentář // ❌ Komentáře nejsou povoleny } ===== Výhody a nevýhody ===== ^ Výhody ^ Nevýhody ^ | **Čitelnost** – snadno čitelný jak pro lidi, tak pro stroje. | **Žádné komentáře** – nelze přidávat poznámky do konfiguračních souborů. | | **Lehký a kompaktní** – menší objem než XML. | **Duplikace klíčů** – v objektu mohou být teoreticky duplicitní klíče (standard říká, že by měly být ignorovány – nebezpečné pro bezpečnost). | | **Široká podpora** – všechny moderní jazyky mají vestavěnou podporu (např. `JSON.parse()` v JavaScriptu, `json` modul v Pythonu). | **Žádná kontrola schématu v základu** – bez validace může být struktura nekonzistentní (řeší se pomocí [[JSON Schema]]). | | **Hierarchická struktura** – ideální pro vnořená data. | **Bez typové bezpečnosti** – např. číslo a řetězec se liší jen uvozovkami, což může vést k chybám. | ===== Použití v praxi ===== * **Webová API**: Většina REST API vrací data ve formátu JSON (např. `Content-Type: application/json`). * **Konfigurační soubory**: Např. `package.json` v Node.js, `tsconfig.json` v TypeScriptu. * **NoSQL databáze**: MongoDB, CouchDB a Firebase ukládají data jako JSON dokumenty. * **Ukládání dat v aplikacích**: Mnoho desktopových i mobilních aplikací používá JSON pro lokální ukládání nastavení nebo dat. Příklad v JavaScriptu: const data = JSON.parse('{"jmeno":"Jan","vek":32}'); console.log(data.jmeno); // "Jan" const jsonStr = JSON.stringify(data); // Vrátí: '{"jmeno":"Jan","vek":32}' Příklad v Pythonu: import json data = {"jmeno": "Jan", "vek": 32} json_str = json.dumps(data, ensure_ascii=False) # Výstup: {"jmeno": "Jan", "vek": 32} obj = json.loads('{"jmeno": "Eva"}') print(obj["jmeno"]) # "Eva" ===== Standardy a specifikace ===== * **RFC 8259** – oficiální specifikace JSON (nahrazuje původní RFC 7159). * **MIME typ**: `application/json` * **Přípona souboru**: `.json` * **Kódování**: JSON musí být v kódování **UTF-8**, **UTF-16** nebo **UTF-32**, přičemž **UTF-8 je doporučeno**. ===== Rozšíření a nástroje ===== * **JSON5** – rozšíření JSON s podporou komentářů, jednoduchých uvozovek, trailing čárek atd. (není kompatibilní s čistým JSON). * **JSON Schema** – jazyk pro popis a validaci struktury JSON dat. * **jq** – příkazový nástroj pro filtrování a transformaci JSON v terminálu. * **YAML** – alternativní formát, který je člověkem ještě lépe čitelný, ale složitější. ===== Bezpečnostní rizika ===== * **JSON injection** – pokud se data z JSON nevalidují, mohou být použita k útokům (např. XSS). * **Prototype pollution** – v JavaScriptu může škodlivý JSON manipulovat s vlastnostmi objektů (zejména při použití `JSON.parse()` s nebezpečnými knihovnami). * **Únik dat** – konfigurační soubory `.json` často obsahují citlivé údaje (API klíče, hesla) – nikdy je neukládej do veřejných repozitářů! ===== Související pojmy ===== * [[XML]] * [[CSV]] * [[REST API]] * [[JSON Schema]] * [[NoSQL]] * [[MIME typy]] ===== Externí odkazy ===== * Oficiální web: https://www.json.org/json-cs.html * RFC 8259: https://datatracker.ietf.org/doc/html/rfc8259 * JSON Schema: https://json-schema.org * JSON Validator: https://jsonlint.com ===== Viz také ===== * [[API]] * [[Datové formáty]] * [[Kódování znaků]] * [[Konfigurační soubory]]