====== 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]]