Data JSON (.json)

RFC Standardní

JavaScript Object Notation (JSON) je lehký, pro člověka čitelný textový formát pro výměnu dat, který podporuje řada programovacích jazyků a který se běžně používá ve webových API.

Převést JSON na HTML

Bezplatný konvertor z JSON do HTML v prohlížeči. Převeďte soubory okamžitě ve svém zařízení.

Komprese JSON online

Soukromě - soubory nikdy neopustí vaše zařízení

Kontrola a metadata

Operační systémy a analyzátory souborů identifikují soubory JSON kontrolou počáteční binární sekvence bajtů:

Vyberte nebo přetáhněte soubory sem

Soukromě - soubory nikdy neopustí vaše zařízení

nebo vložte Ctrl+V
Záruka ochrany soukromí s nulovým přenosem po síti: 0 bajtů odesláno na externí servery. Veškeré zpracování probíhalo lokálně v sandboxu vašeho prohlížeče.

Podpis hlavičky na úrovni bajtů (Magic Bytes)

Operační systémy a analyzátory souborů identifikují soubory JSON kontrolou počáteční binární sekvence bajtů:

HEXADECIMÁLNÍ PODPIS (POSUN 0):

7B or 5B

ASCII REPREZENTACE: { or [

Standardizace: RFC 8259 / ECMA-404 / ISO/IEC 21778

Technické specifikace

Architektura kontejneruLehký textový formát nezávislý na programovacím jazyku pro výměnu dat
KompreseGzip, Brotli a Zstandard mohou komprimovat text JSON; výsledná velikost závisí na datech a nastavení
Pořadí bajtůUnicode kódovaný v UTF-8 (doporučuje se bez značky pořadí bajtů / BOM)
Barevné prostoryNevztahuje se
Kanály a strukturaŠest základních datových typů: objekt, pole, řetězec, číslo, boolean, null
Max. rozměryNeomezeno; limitováno pouze pamětí parseru a maximální délkou řetězce
PrůhlednostNevztahuje se
Streamování a progresivní načítáníNDJSON (Newline Delimited JSON) / JSON Lines umožňuje progresivní zpracování proudů dat

Technická srovnávací matice: JSON vs konkurence

Technický atributJSON (Aktuální)YAMLXMLProtocol Buffers
Složitost syntaxeMinimální (6 typů, přísná syntaxe)Vysoká (založeno na odsazení, složitá specifikace)Vysoká (ukecané uzavírací značky, jmenné prostory)Binární přenosový formát definovaný schématem
Výkon parsováníExtrémně rychlý ve všech moderních jazycíchPomalý (složité parsování odsazení)Mírně až velmi pomalý (náročná konstrukce DOM)Ultrarychlá (binární deserializace bez kopírování)
Podpora komentářůNe (záměrně vynecháno, aby se zabránilo nárůstu metadat)Ano (# komentáře)Ano (<!-- komentáře -->)Ano v souborech .proto
Velikost síťového payloaduKompaktní text; výsledek komprese závisí na datech a nastaveníKompaktní textUpovídaný text (silné opakování značek)Ultrakompaktní binární

Běžné režimy poškození a příručka pro obnovení v hex

SyntaxError: neočekávaný token , v JSON na pozici X.

Hlavní příčina: Koncová čárka za poslední položkou v poli nebo objektu, což je v JSONu podle RFC 8259 přísně nelegální.

Obnovení: Před předáním do JSON.parse() odstraňte koncové čárky z klíčů objektů a položek polí.

SyntaxError: neočekávaný token ' v JSON.

Hlavní příčina: Řetězce nebo klíče uzavřené v jednoduchých uvozovkách ('') namísto dvojitých uvozovek ("").

Obnovení: Nahraďte všechny řetězce a klíče v jednoduchých uvozovkách standardními řetězci v dvojitých uvozovkách.

Bezpečnostní analýza a vektory útoků na parser

JSON je čistě textový a bezpečný proti přímému spuštění kódu, avšak parsování nedůvěryhodného JSONu může vést k Prototype Pollution, ReDoS nebo vyčerpání paměti.

Známé vektory útoků

  • Prototype Pollution: Klíče pojmenované '__proto__' nebo 'constructor' modifikující Object.prototype v JavaScriptových aplikacích.
  • Útok odepření služby (DoS) přetečením zásobníku prostřednictvím hluboce vnucených JSON struktur (např. 10 000 otevíracích závorek).
  • Ztráta numerické přesnosti: JavaScriptová čísla větší než 2^53 - 1 (9 007 199 254 740 991) tiše ztrácejí přesnost.

Doporučené bezpečnostní postupy: Nikdy nevyhodnocujte JSON pomocí eval(). Používejte JSON.parse() a sanitizujte vlastnosti '__proto__' v rekurzivních funkcích pro slučování objektů.

Historický vývoj a milníky

2017RFC 8259 standardizuje UTF-8 jako jediné povinné kódování znaků pro JSON.
2013ECMA-404 definuje syntaxi JSON, kterou používá mnoho programovacích jazyků a platforem.
2001Douglas Crockford specifikuje JSON s cílem umožnit bezstavovou datovou komunikaci mezi prohlížečem a serverem.

Klíčové výhody a přednosti

  • Pro lidi čitelná, sama sebe popisující a stručná textová struktura.
  • Nativní podpora parsování integrovaná v JavaScriptových enginech (JSON.parse) a každém významném programovacím jazyku.
  • Přísná specifikace zabraňuje libovolnému spouštění kódu.

Technická omezení a nevýhody

  • Žádná podpora pro komentáře, koncové čárky nebo cyklické odkazy na objekty.
  • Žádné nativní binární typy (binární data musí být zakódována v base64, což zvětšuje velikost o 33 %).
  • Neefektivní serializace ve srovnání s binárními formáty jako Protocol Buffers nebo MessagePack.

Zajímavé technické drobnosti

  • Douglas Crockford přidal do původních nástrojů JSMin JSON licenční doložku softwaru: „Software bude používán pro dobro, ne pro zlo".
  • JSON je striktní podmnožinou syntaxe JavaScriptu, ale do verze ES2019 byly surové neescapované znaky U+2028 a U+2029 platné v JSONu, avšak neplatné v JavaScriptových řetězcích.
  • Douglas Crockford zjistil, že rané webové prohlížeče dokázaly vyhodnotit JSON přímo na objekty pomocí nativního JavaScriptového eval() předtím, než byla v ECMAScript 5 standardizována dedikovaná API JSON.parse().

Často kladené technické otázky

Proč JSON nepodporuje komentáře?

Gramatika JSON komentáře nepovoluje. Implementace se mohou lišit ve zpracování rozšíření a dat specifických pro aplikaci, takže samotný formát interoperabilitu nezaručuje.

Jak se v JSONu ukládají 64bitová celá čísla bez ztráty přesnosti?

Nativní typ Number v JavaScriptu je číslo s plovoucí řádovou čárkou s dvojitou přesností dle IEEE 754, které přesně podporuje pouze celá čísla do 2^53 - 1. 64bitová celá čísla (například ID nebo časová razítka z databáze) musí být v JSONu serializována jako řetězce (např. '1234567890123456789').

Jaký je rozdíl mezi JSON a NDJSON / JSON Lines?

Standardní JSON balí celý payload do jednoho kořenového objektu nebo pole, což vyžaduje, aby parsery načetly celý text před jeho vyhodnocením. NDJSON (Newline Delimited JSON) odděluje jednotlivé platné záznamy JSON pomocí znaků nového řádku (\n), což umožňuje paměťově efektivní streamování obrovských multi-gigabajtových datových sad řádek po řádku.