JSON | |
---|---|
Rozšíření | .json[jeden] |
MIME typ | application/json [2] |
Typ formátu | Výměna dat |
Rozšířeno z | JavaScript |
standard(y) | RFC 8259 |
webová stránka | json.org _ |
Mediální soubory na Wikimedia Commons |
JSON ( anglicky JavaScript Object Notation , obvykle vyslovováno jako / ˈ dʒ eɪ s ən / JAY-sən [3] ) je textový formát pro výměnu dat založený na JavaScriptu . Stejně jako mnoho jiných textových formátů je i JSON pro lidi snadno čitelný. Formát JSON byl vyvinut Douglasem Crockfordem [4] .
Navzdory tomu, že je odvozen z JavaScriptu (přesněji jazykové podmnožiny standardu ECMA-262 z roku 1999 ), je formát považován za jazykově nezávislý a lze jej použít téměř s jakýmkoli programovacím jazykem . Pro mnoho jazyků existuje hotový kód pro vytváření a zpracování dat ve formátu JSON.
Vzhledem ke své stručnosti ve srovnání s XML může být formát JSON vhodnější pro serializaci složitých struktur. Používá se ve webových aplikacích jak pro výměnu dat mezi prohlížečem a serverem ( AJAX ), tak mezi servery (programové párování HTTP ).
Protože formát JSON je podmnožinou syntaxe jazyka JavaScript, lze jej rychle deserializovat pomocí JSON.parse().
Text JSON je (zakódovaný) jednou ze dvou struktur:
Datové struktury používané JSON jsou podporovány jakýmkoli moderním programovacím jazykem, což umožňuje používat JSON k výměně dat mezi různými programovacími jazyky a softwarovými systémy.
Jako hodnoty v JSON lze použít následující:
Řetězec je velmi podobný literálu stejného datového typu v JavaScriptu . Číslo je také velmi podobné číslu JavaScript, kromě toho, že používá pouze desítkový formát (s tečkou jako oddělovačem). Mezi libovolné dva prvky syntaxe lze vložit mezery.
Následující příklad ukazuje JSON reprezentaci dat o objektu, který popisuje osobu. Data obsahují pole řetězce jména a příjmení , informace o adrese a pole obsahující seznam telefonních čísel. Jak můžete vidět z příkladu, hodnota může být vnořená struktura.
{ "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : { "streetAddress" : "Moskovskoe sh., 101, kv.101" , "city" : "Leningrad" , "postalCode" : 101101 }, "phoneNumbers" : [ "812 123-1234" , "916 123-4567" ] }V JSON lze jako hodnoty použít jak čísla, tak řetězce. Proto záznam "postalCode": "101101"obsahuje řetězec a "postalCode": 101101 - již číselnou hodnotu. Kvůli slabému psaní v JavaScriptu a PHP může být řetězec přetypován na číslo a neovlivňuje logiku programu. Doporučuje se však zacházet s typem hodnoty opatrně, protože JSON se používá pro výměnu mezi systémy.
V XML by taková struktura vypadala asi takto:
<person> <firstName> Ivan </firstName> <lastName> Ivanov </lastName> <address> <streetAddress> Moskovskoye sh., 101, kv.101 </streetAddress> <city> Leningrad </city> <postalCode> 101101 </postalCode> </address> <phoneNumbers> <phoneNumber> 812 123-1234 </phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>nebo takhle:
<person firstName= "Ivan" lastName= "Ivanov" > <address streetAddress= "101 Moskovskoye sh., apt. 101" city= "Leningrad" postalCode= "101101" /> <phoneNumbers> <phoneNumber> 812 <phoneNumber> 812 < 23-1234 /phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>JSON5 je navrhované rozšíření formátu json v souladu se syntaxí ECMAScript 5, a to z důvodu, že json slouží nejen ke komunikaci mezi programy, ale také se vytváří/upravuje ručně [6] . Soubor JSON5 je vždy platný kód ECMAScript 5. JSON5 je zpětně kompatibilní s JSON. Pro některé programovací jazyky již existují parsery json5 [7] .
Některé inovace:
Funkčně i syntakticky je JSON podmnožinou jazyka YAML . Konkrétně specifikace YAML 1.2 uvádí, že „jakýkoli soubor JSON je platným souborem YAML“ [8] . Nejběžnější YAML parser je také schopen zpracovat JSON [9] . Specifikace YAML před verzí 1.2 plně nepokrývala JSON, primárně kvůli nedostatku nativní podpory UTF-32 YAML a také požadavku na prostor za oddělovačem čárky; specifikace JSON navíc obsahovala komentáře stylu /* */.
Nejdůležitější rozdíl mezi YAML je sada rozšíření syntaxe, která nemají ekvivalent v JSON:
JSON Schema je jedním z jazyků pro popis struktury dokumentu JSON. Používá syntaxi JSON. Na základě konceptů XML Schema , RelaxNG , Kwalify . JSON Schema je samopopisující jazyk: při použití ke zpracování dat a popisu jejich platnosti lze použít stejné nástroje pro serializaci / deserializaci [10] .
Standard JSON nepodporuje odkazy na objekty , ale požadovaného výsledku můžete dosáhnout pomocí dalších konvencí. Doporučení W3C pro propojená data je JSON-LD , který používá datový model RDF . V JSON-LD je k datům přidán kontext (kontext), který propojuje vlastnosti objektů JSON-document s prvky ontologie [11] .
Následující příklad kódu Javascript ukazuje, jak může prohlížeč použít XMLHttpRequest k vyžádání objektu JSON ze serveru (serverová strana programu je vynechána; měl by obsahovat kód, který odesílá data ve formátu řetězce JSON jako odpověď na požadavky pro url).
var http_request = new XMLHttpRequest (); http_požadavek . onreadystatechange = function () { if ( http_request . readyState !== 4 ) return ; if ( http_request . status !== 200 ) throw new Error ( 'požadavek byl poražen' ); udělat_něco_s_objektem ( JSON . parse ( http_request . responseText )); http_request = null ; }; http_požadavek . otevřít ( "GET" , url , true ); http_požadavek . odeslat ( null );Všimněte si, že tento příklad XMLHttpRequest nepodporuje Internet Explorer do verze 6 včetně, takže pro ně musí být použit mírně odlišný kód. Možnosti použití XMLHttpRequest jsou omezené kvůli stejné politice původu: URL odpověď na požadavek musí být ve stejné doméně DNS jako server hostující stránku požadující odpověď. Alternativně se používá přístup JSONP , který zahrnuje použití kódovaného volání funkce předávaného mezi klientem a serverem, takže klient může načíst data kódovaná JSON z domén třetích stran a upozornit volajícího na dokončení, i když to přináší určité zabezpečení. rizika a další požadavky na server.
Alternativně můžete použít prvky v kódu stránky <iframe>k vyžádání dat JSON asynchronně, nebo jednoduše <form action="url_to_cgi_script">. Tyto přístupy byly převládající před širokou podporou XMLHttpRequest.
K předávání dat JSON můžete také použít dynamické značky <script>. Tato metoda může obejít stejnou politiku původu, ale zavádí zranitelný kód. JSONRequest byl navržen jako bezpečnější alternativa .
Ačkoli je JSON určen k serializaci, jeho syntaxe je podobná JavaScriptu, což vytváří řadu bezpečnostních problémů. Často je funkce aplikována na data přijatá z externího zdroje ve formátu JSON eval()bez jakéhokoli předběžného ověření.
Vzhledem k tomu, že JSON je reprezentován jako syntakticky správný kus kódu JavaScript, nejjednodušším způsobem, jak analyzovat data JSON v programu JavaScript, je použít vestavěnou funkci JavaScript eval(), která je navržena ke spouštění výrazů JavaScript. S tímto přístupem není potřeba používat další analyzátory.
Technika použití eval()činí systém zranitelným, pokud zdroj použitých dat JSON není důvěryhodný . Taková data mohou být škodlivým kódem JavaScript pro útoky Injection Pomocí této zranitelnosti je možné provádět krádeže dat, padělání autentizace.
Byla navržena nová funkce, JSON.parse()která dokáže zpracovávat pouze data JSON. Byl představen ve čtvrté verzi standardu ECMAScript a popsán v článku „JSON: A fat-free alternative to XML“ [12] . V současnosti je k dispozici jako JavaScriptová knihovna [13] a byla zahrnuta do pátého vydání ECMAScriptu.
Nejnovější verze webových prohlížečů mají vestavěnou podporu pro JSON a jsou schopny ji zpracovat.
Nedomyšlené použití JSON činí weby zranitelnými vůči padělání požadavků mezi weby (CSRF nebo XSRF) [14] . Protože značka <script>umožňuje použití zdroje, který nepatří do stejné domény jako zdroj, který používá, umožňuje to spouštění kódu pod rouškou dat JSON v kontextu libovolné stránky, což umožňuje kompromitovat hesla nebo další citlivé informace uživatelů, kteří jsou autorizováni na jiném webu.
Zdá se, že to je problém pouze v případě, že data JSON obsahují citlivé informace, které mohou být kompromitovány třetí stranou, a pokud server spoléhá na jednoho původu, blokuje přístup k datům, když narazí na externí požadavek To není problém, pokud server určí platnost požadavku a poskytne data pouze v případě, že jsou správné. K určení toho nelze použít soubor cookie HTTP . Výhradní použití souboru cookie HTTP je zneužíváno paděláním požadavků mezi stránkami .
JSONP ( JSON Padding ) je rozšířením JSON, když je jako vstupní argument určen název funkce zpětného volání.
Technologie je založena na skutečnosti, že bezpečnostní politika prohlížeče nezakazuje použití tagu <script type="text/javascript" src="…"></script>pro přístup k jiným serverům, než je server, ze kterého byla stránka načtena.
Bez použití technologie JSONP (to znamená pouze s použitím kódování dat JSON) může server vracet pouze data. Například takto:
{ "papír" : "A4" , "počítat" : 5 }Jedná se však pouze o data a nemohou ovlivnit prohlížeč.
Pomocí techniky JSONP je název funkce zpětného volání předán serveru třetí strany v řetězci volání (GET):
<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>Zde parametr jsonp obsahuje název zpětného volání funkce parseResponse.
Nyní může zahraniční server example.com vrátit následující kód:
parseResponse ({ "papír" : "A4" , "počet" : 5 })Nyní kód volá funkci javascriptu první domény.
Tato myšlenka byla původně navržena na blogu MacPython v roce 2005 [15] a v současné době ji využívá mnoho aplikací Web 2.0 , jako jsou aplikace Dojo Toolkit Applications, Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d a webové služby zanox. Další rozšíření tohoto protokolu byla navržena tak, aby zahrnovala další argumenty, jako v případě JSONPP [16] podporovaného webovými službami S3DB .
Protože JSONP používá značky skriptů, jsou hovory v podstatě otevřené světu. Z tohoto důvodu nemusí být JSONP vhodný pro ukládání citlivých dat [17] .
Zahrnutí značek skriptu ze vzdálených webů jim umožňuje předávat jakýkoli obsah na webu. Pokud má vzdálený web chyby zabezpečení, které umožňují vkládání JavaScriptu, může být ovlivněn i původní web.
JSONPP ( angl. parameterized JSON with padding - "parameterized JSON with padding") - vývoj myšlenky JSONP.
JSONPP obsahuje zdrojovou adresu URL, název funkce, která zpracuje data JSON, řetězec, který se má vyhodnotit po přijetí dat, a řetězec, který se má vyhodnotit po dokončení dat:
JSON_call ( SRC , JSONP , JSONPP , ONLOAD );nakonec se otočí
ans = JSONP ( SRC ) { eval ( JSONPP ( ans )); eval ( ONLOAD ); }Obecně není počet parametrů pro samotný nápad JSONPP důležitý. Stačí SRC, JSONP, JSONPP (a jejich zpracování na straně serveru a poté na straně klienta), aby to byl JSONPP.
Zvažte příklad práce se službou S3DB.
function s3db_jsonpp_call ( src , next_eval ){ var call = "call_" + Math . náhodný (). toString (). nahradit ( /\./g , "" ); var headID = dokument . getElementsByTagName ( "head" )[ 0 ]; var skript = dokument . createElement ( 'script' ); skript . id = volání ; skript . type = 'text/javascript' ; // pomocí vycpaného, parametrizovaného json src = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + skript . id + "')" ; skript . src = src ; ID hlavy . appendChild ( skript ); // načtení odpovědi } function s3db_jsonpp ( ans , jsonpp ){ eval ( jsonpp ); vrátit ans ; } function remove_element_by_id ( id ){ var e = document . getElementById ( id ); e . parentNode . removeChild ( e ); vrátit false ; }V příkladu funkce s3db_jsonpp_call()vytvoří element skriptu v hlavové části modelu DOM, jehož src odpovídá volání JSONPP.
Po obdržení odpovědi ze serveru se zavolá s3db_jsonpp() - předává se v parametrech volání, jak by to mělo být podle pravidel JSONP.
Interně s3db_jsonpp()bude fungovat eval(jsonpp)a vrátí se hodnota ans.
Volání eval(onload) má za následek spuštění remove_element_by_id()s id vytvořeného skriptu v hlavičce a případně jeho smazání, protože už se stejně nebude používat, protože id v příkladu bylo náhodně vygenerováno na samém začátku funkce s3db_jsonpp_call(). Toto volání je v odpovědi serveru.
JSONB je binární rozšíření JSON představené PostgreSQL ve verzi 9.4.18. JSONB je ve skutečnosti binární reprezentace JSON [18] , s tím rozdílem, že v uložených řetězcích jsou odstraněny mezery, není zachováno řazení objektů a je uložena pouze poslední hodnota pro duplicitní klíče [19] .
Značkovací jazyky dokumentů | |
---|---|
kancelářské dokumenty | |
dobře známý | |
Méně známé |
Web a webové stránky | |
---|---|
globálně | |
Lokálně | |
Typy stránek a služeb |
|
Tvorba a údržba | |
Typy rozložení, stránek, webů | |
Technický | |
Marketing | |
Společnost a kultura |