JSON

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. augusztus 28-án felülvizsgált verziótól ; az ellenőrzések 14 szerkesztést igényelnek .
JSON
Kiterjesztés .json[egy]
MIME típusú Application/json [2]
Formátum típusa Adatcsere
Kibontva innen JavaScript
Szabvány(ok) RFC 8259
Weboldal json.org
 Médiafájlok a Wikimedia Commons oldalon

A JSON ( angol  JavaScript Object Notation , általában / ˈ dʒ s ən / JAY-sən [3] ) egy JavaScript -en alapuló szövegalapú adatcsere-formátum . Sok más szövegformátumhoz hasonlóan a JSON is könnyen olvasható az emberek számára. A JSON formátumot Douglas Crockford fejlesztette ki [4] .

Annak ellenére, hogy a JavaScriptből (pontosabban az 1999 -es ECMA-262 szabvány egyik nyelvi részhalmazából ) származik, a formátum nyelvfüggetlennek tekinthető, és szinte bármilyen programozási nyelvvel használható . Számos nyelvhez létezik kész kód az adatok JSON formátumú létrehozásához és feldolgozásához.

Használat

Az XML - hez viszonyított tömörsége miatt a JSON formátum alkalmasabb lehet összetett struktúrák sorosítására . Webes alkalmazásokban egyaránt használják adatcserére a böngésző és a szerver között ( AJAX ), valamint a szerverek között (programozott HTTP - párosítások).

Mivel a JSON formátum a JavaScript nyelv szintaxisának egy részhalmaza, gyorsan deszerializálható a JSON.parse().

Szintaxis

A JSON-szöveg két struktúra egyike (kódolt):

A JSON által használt adatstruktúrákat bármely modern programozási nyelv támogatja, ami lehetővé teszi a JSON használatát a különböző programozási nyelvek és szoftverrendszerek közötti adatcserére.

A következők használhatók értékként a JSON-ban:

A karakterlánc nagyon hasonlít az azonos adattípusú literálhoz a JavaScriptben . A számok nagyon hasonlítanak a JavaScript-számokhoz, azzal a különbséggel, hogy csak decimális formátumot használnak (pont elválasztóként). Bármely két szintaktikai elem közé szóközt lehet beilleszteni.

A következő példa egy személyt leíró objektum adatainak JSON-ábrázolását mutatja be. Az adatok vezeték- és utónév - karakterláncot tartalmaznak, címadatokat, valamint egy telefonszámlistát tartalmazó tömböt. Amint a példából látható, az érték lehet egy beágyazott szerkezet.

{ "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : { "streetAddress" : "Moskovskoe sh., 101, kv.101" , "city" : "Leningrád" , "postalCode" : 101101 }, "phoneNumbers" : [ "812 123-1234" , "916 123-4567" ] }

Mind a számok, mind a karakterláncok használhatók értékként a JSON-ban. Ezért a rekord "postalCode": "101101"tartalmaz egy karakterláncot, és "postalCode": 101101 - már egy numerikus értéket. A JavaScript és a PHP gyenge gépelése miatt a karakterlánc egy számra önthető , és nem befolyásolja a program logikáját. Javasoljuk azonban, hogy óvatosan kezelje az értéktípust, mivel a JSON-t rendszerközi cserére használják.

XML-ben egy ilyen struktúra valahogy így nézne ki:

<person> <firstName> Ivan </firstName> <lastName> Ivanov </lastName> <address> <streetAddress> Moskovskoye sh., 101, kv.101 </streetAddress> <city> Leningrád </city> <postalCode> 101101 </postalCode> </address> <phoneNumbers> <phoneNumber> 812 123-1234 </phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumber> </person>

vagy így:

<person firstName= "Ivan" lastName= "Ivanov" > <address streetAddress= "101 Moskovskoye sh., apt. 101" city= "Leningrád" postalCode= "101101" /> <phoneNumbers> <phoneNumber> 812 123-1234 < /phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumber> </person>

JSON5

A JSON5  a json formátum javasolt kiterjesztése az ECMAScript 5 szintaxisának megfelelően, mivel a json-t nem csak a programok közötti kommunikációra használják, hanem manuálisan is létrehozzák/szerkesztik [6] . A JSON5 fájl mindig érvényes ECMAScript 5 kód. A JSON5 visszafelé kompatibilis a JSON-nal. Egyes programozási nyelvekhez már léteznek json5 elemzők [7] .

Néhány újítás:

  • Mind az egysoros, //mind a többsoros /* */megjegyzések támogatottak.
  • A rekordokban és listákban az utolsó elem után vessző lehet (elemek másolásakor hasznos).
  • A beviteli kulcsok idézőjelek nélkül lehetnek, ha azok érvényes ECMAScript 5 azonosítók.
  • A karakterláncok egyszeres vagy dupla idézőjelek közé tehetők.
  • A számok hexadecimálisak lehetnek, kezdődhetnek vagy végződhetnek tizedesvesszővel, beleértve a Végtelent, a -Végtelenséget, a NaN-t és a -NaN-t, és + jellel kezdődhetnek.

Összehasonlítás a YAML-lel

Mind funkcionálisan, mind szintaktikailag a JSON a YAML nyelv egy részhalmaza . Konkrétan a YAML 1.2 specifikációja kimondja, hogy "bármely JSON-fájl érvényes YAML-fájl" [8] . A legelterjedtebb YAML értelmező a JSON kezelésére is képes [9] . Az 1.2 előtti YAML specifikáció nem fedte le teljesen a JSON-t, elsősorban a YAML natív UTF-32 támogatásának hiánya , valamint a vessző utáni helyigény miatt; emellett a JSON specifikáció /* */ stílusú megjegyzéseket is tartalmazott.

A legfontosabb különbség a YAML között a szintaktikai kiterjesztések halmaza, amelyeknek nincs megfelelője a JSON-ban:

  • relációs adatok támogatása : egy YAML dokumentumban hivatkozhat egy horgonyra, amely korábban egy fájlban/folyamban találkozott; rekurzív struktúrák kifejezhetők ily módon .
  • a primitíveken túl bővíthető adattípusok támogatása : karakterláncok, számok, logikai értékek stb.
  • blokk szintaxis támogatás behúzással; lehetővé teszi a strukturált adatok leírását extra karakterek használata nélkül: mindenféle zárójelek, idézőjelek stb.

JSON-séma

A JSON-séma a JSON-dokumentumok szerkezetének leírására szolgáló nyelvek egyike. JSON szintaxist használ. Az XML Schema , RelaxNG , Kwalify koncepciói alapján . A JSON Schema egy önleíró nyelv: amikor az adatok feldolgozására és érvényességének leírására használják, ugyanazok a szerializációs / deserializációs eszközök használhatók [10] .

JSON-LD formátum a csatolt adatokhoz

A JSON-szabvány nem támogatja az objektumhivatkozásokat , de további konvenciókkal elérheti a kívánt eredményt. A csatolt adatokra vonatkozó W3C ajánlás a JSON-LD , amely az RDF adatmodellt használja . A JSON-LD-ben egy kontextus (context) kerül az adatokhoz, összekapcsolva a JSON-dokumentum objektumok tulajdonságait ontológiai elemekkel [11] .

JSON használata Ajaxban

A következő Javascript kódpélda bemutatja, hogyan tudja a böngésző az XMLHttpRequest segítségével JSON-objektumot kérni a kiszolgálótól (a program szerveroldala kimaradt; annak olyan kódot kell tartalmaznia, amely JSON-karakterlánc formátumban küldi el az adatokat a következő kérésére válaszul url).

var http_request = new XMLHttpRequest (); http_request . onreadystatechange = function () { if ( http_request . readyState !== 4 ) return ; if ( http_request . status !== 200 ) throw new Error ( 'kérelem elbukott' ); do_something_with_object ( JSON . parse ( http_request . responseText )); http_request = null ; }; http_request . open ( "GET" , url , true ); http_request . küld ( null );

Ne feledje, hogy ez az XMLHttpRequest példa nem támogatja az Internet Explorert a 6-os verzióig bezárólag, ezért ezekhez kissé eltérő kódot kell használni. Az XMLHttpRequest használatának lehetőségei korlátozottak az azonos eredetszabály miatt: a kérésre adott URL-válasznak ugyanabban a DNS-tartományban kell lennie, mint a választ kérő oldalt tároló szervernek. Alternatív megoldásként JSONP- megközelítést alkalmaznak , amely az ügyfél és a szerver között átadott kódolt függvényhívást foglal magában, hogy az ügyfél betölthesse a JSON-kódolású adatokat harmadik féltől származó tartományokból, és értesítse a hívót a befejezésről, bár ez némi biztonságot jelent. kockázatokat és további szerverkövetelményeket.

Alternatív megoldásként használhatja az oldalkód elemeit a <iframe>JSON-adatok aszinkron vagy egyszerűen kérésére <form action="url_to_cgi_script">. Ezek a megközelítések az XMLHttpRequest széles körű támogatása előtt elterjedtek voltak.

Dinamikus címkéket is használhat JSON-adatok továbbítására <script>. Ez a módszer megkerülheti ugyanazt a származási szabályzatot, de sérülékeny kódot vezet be. A JSONRequest biztonságosabb alternatívaként javasolták .

Biztonsági problémák

Bár a JSON-t szerializáltnak szánják, szintaxisa hasonló a JavaScript-hez, és ez számos biztonsági problémát okoz. Gyakran egy függvényt alkalmaznak a külső forrásból JSON formátumban kapott adatokra eval()előzetes ellenőrzés nélkül.

JavaScript eval()

Mivel a JSON szintaktikailag helyes JavaScript-kódrészletként jelenik meg, a JSON-adatok JavaScript-programban történő elemzésének legegyszerűbb módja a JavaScript beépített függvényének használata eval(), amely JavaScript-kifejezések végrehajtására szolgál. Ezzel a megközelítéssel nincs szükség további elemzők használatára.

A használati technika eval()sebezhetővé teszi a rendszert, ha a használt JSON-adatok forrása nem megbízható . Az ilyen adatok rosszindulatú JavaScript-kódok lehetnek Code InjectionEzt a sérülékenységet felhasználva lehetőség nyílik adatlopásra, hitelesítés-hamisításra.

Egy új funkciót javasoltak JSON.parse(), amely csak JSON-adatokat tud feldolgozni. Az ECMAScript szabvány negyedik verziójában vezették be, és a „JSON: Az XML zsírmentes alternatívája” [12] című cikkben írják le . Jelenleg JavaScript-könyvtárként érhető el [13] , és az ECMAScript ötödik kiadásába is bekerült.

Beágyazott JSON

A webböngészők legújabb verziói beépített JSON-támogatással rendelkeznek, és képesek feldolgozni azt.

Domainek közötti kérés hamisítása

A JSON rosszul átgondolt használata sebezhetővé teszi a webhelyeket a helyek közötti kérés-hamisítással (CSRF vagy XSRF) szemben [14] . Mivel a címke <script>lehetővé teszi olyan forrás használatát, amely nem tartozik ugyanahhoz a tartományhoz, mint a felhasznált erőforrás, így egy tetszőleges oldal kontextusában JSON-adatok leple alatt kódot lehet futtatni, ami lehetővé teszi a jelszavak , ill . más webhelyen engedélyezett felhasználók egyéb érzékeny adatai.

Ez csak akkor tűnik problémásnak, ha a JSON-adatok olyan bizalmas információkat tartalmaznak, amelyeket egy harmadik fél feltörhet, és ha a kiszolgáló egyetlen forrásból származó házirendre támaszkodik, az adatokhoz való hozzáférést, amikor külső kéréssel találkozik Ez nem probléma, ha a szerver megállapítja a kérés érvényességét, és csak akkor ad meg adatot, ha az helyes. Ennek megállapítására HTTP cookie nem használható. A HTTP cookie kizárólagos használatát a webhelyek közötti kérés-hamisítás használja ki .

JSONP és JSONPP

A JSONP ( JSON Padding )   a JSON kiterjesztése, amikor egy visszahívási függvény neve bemeneti argumentumként van megadva.

A technológia azon alapul, hogy a böngésző biztonsági szabályzata nem tiltja a címke használatát <script type="text/javascript" src="…"></script>az oldal betöltésének kiszolgálójától eltérő szerverekhez.

A JSONP technológia használata nélkül (vagyis csak JSON-adatkódolás használatával) a szerver csak adatokat tud visszaadni. Például így:

{ "papír" : "A4" , "számlálás" : 5 }

Ez azonban csak adat, és nem befolyásolja a böngészőt.

A JSONP technika használatával a visszahívási függvény neve a hívási karakterláncban (GET) kerül átadásra a harmadik fél szerverének:

<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>

Itt a jsonp paraméter a parseResponse függvény visszahívási nevét tartalmazza.

Most az example.com külföldi szerver a következő kódot tudja visszaadni:

parseResponse ({ "paper" : "A4" , "count" : 5 })

Most a kód meghívja az első tartomány javascript függvényét.

Az ötletet eredetileg a MacPython blogon javasolták 2005-ben [15] , és jelenleg számos Web 2.0 alkalmazás használja, mint például a Dojo Toolkit Applications, a Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d és a zanox webszolgáltatások. A protokoll további kiterjesztését javasolták további érvekkel, például az S3DB webszolgáltatások által támogatott JSONPP [16] esetében.

Mivel a JSONP szkriptcímkéket használ, a hívások alapvetően nyitottak a világ számára. Emiatt előfordulhat, hogy a JSONP nem alkalmas érzékeny adatok tárolására [17] .

A távoli webhelyekről származó szkriptcímkék bevonása lehetővé teszi számukra, hogy a webhelyen található bármilyen tartalmat továbbítsanak. Ha a távoli webhelyen vannak olyan sebezhetőségek, amelyek lehetővé teszik a Javascript befecskendezését, akkor az eredeti hely is érintett lehet.

JSONPP ( eng.  paraméteres JSON padding  - "parameterized JSON with padding") - a JSONP ötlet fejlesztése.

A JSONPP tartalmazza a forrás URL-t, a JSON-adatokat feldolgozó függvény nevét, az adatok beérkezése utáni eval karakterláncot és az adatok befejezésekor értékelendő karakterláncot:

JSON_call ( SRC , JSONP , JSONPP , ONLOAD );

végül megfordul

ans = JSONP ( SRC ) { eval ( JSONPP ( ans )); eval ( ONLOAD ); }

Általában a paraméterek száma nem fontos magának a JSONPP-ötletnek. SRC, JSONP, JSONPP (és ezek feldolgozása a szerver oldalon, majd a kliens oldalon) elég ahhoz, hogy JSONPP legyen.

Tekintsük az S3DB szolgáltatással való munka példáját.

function s3db_jsonpp_call ( src , next_eval ){ var call = "call_" + Math . véletlenszerű (). toString (). csere ( /\./g , "" ); var headID = dokumentum . getElementsByTagName ( "fej" )[ 0 ]; var script = dokumentum . createElement ( 'script' ); forgatókönyv . id = hívás ; forgatókönyv . type = 'text/javascript' ; // párnázott, paraméterezett json használatával src = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + script . id + "')" ; forgatókönyv . src = src ; fejazonosító . appendChild ( script ); // válasz lekérése } function s3db_jsonpp ( ans , jsonpp ){ eval ( jsonpp ); return ans ; } function remove_element_by_id ( id ){ var e = document . getElementById ( id ); e . szülőcsomópont . RemoveChild ( e ); return false ; }

A példában a függvény s3db_jsonpp_call()létrehoz egy szkriptelemet a DOM fejrészében, amelynek src-je megegyezik a JSONPP-hívással.

Miután megkapta a választ a kiszolgálótól, meg lesz hívva s3db_jsonpp() - a hívási paraméterekben átadásra kerül, ahogyan a JSONP szabályok szerint kell.

Belsőleg s3db_jsonpp()működni fog eval(jsonpp), és az ans értékét visszaadjuk.

Az eval(onload) meghívása azt eredményezi, remove_element_by_id()hogy a létrehozott szkript azonosítójával a fejben fut, és végül törlődik, mert úgysem lesz többé használva, mivel a példában szereplő id véletlenszerűen generált a függvény legelején s3db_jsonpp_call(). Ez a hívás a szerver válaszában van.

jsonb

A JSONB egy bináris JSON-bővítmény, amelyet a PostgreSQL 9.4.18-as verziójában vezettek be. Valójában a JSONB a JSON bináris reprezentációja [18] , azzal a különbséggel, hogy a tárolt karakterláncokban a szóközök eltávolításra kerülnek, az objektumok rendezése nem marad meg, és csak a duplikált kulcsok utolsó értéke tárolódik [19] .

Lásd még

Jegyzetek

  1. https://www.file-extension.info/format/json
  2. Crockford D. The application/json Media Type for JavaScript Object Notation (JSON)  (angol) - IETF , 2006. - 10 p. doi : 10.17487/RFC4627
  3. Doug Crockford "Google Tech Talks: JavaScript: The Good Parts" (2009. február 7.). Letöltve: 2017. szeptember 28. Az eredetiből archiválva : 2017. július 29.
  4. JSON Redux AKA RFC7159 . Letöltve: 2014. szeptember 12. Az eredetiből archiválva : 2014. július 2.
  5. JSON-RPC 1.1 Alt: Szolgáltatás-, eljárás- és paraméternevek . Letöltve: 2016. április 28. Az eredetiből archiválva : 2016. március 9..
  6. Aseemk JSON5 . Letöltve: 2015. november 26. Az eredetiből archiválva : 2015. december 11.
  7. In The Wild json5/json5 Wiki GitHub . Letöltve: 2017. január 27. Az eredetiből archiválva : 2020. december 5..
  8. A YAML nem jelölőnyelv (YAML™) 1.2-es verzió  (  halott link) . — Munkatervezet 2008-05-11. Hozzáférés dátuma: 2009. szeptember 24. Az eredetiből archiválva : 2008. május 16.
  9. A YAML a JSON . RedHanded (2005. április 7.). Letöltve: 2012. szeptember 25. Az eredetiből archiválva : 2012. december 7.. .
  10. json.com. JSON-sémajavaslat  (angol)  (a hivatkozás nem érhető el) . Az eredetiből archiválva : 2008. május 14.
  11. JSON-LD Syntax 1.0 (2011. december 27.). Hozzáférés dátuma: 2011. december 30. Az eredetiből archiválva : 2012. január 12.
  12. ↑ JSON : Az XML zsírmentes alternatívája  . Az eredetiből archiválva: 2012. február 12.
  13. json2.js  . _ Letöltve: 2009. szeptember 24. Az eredetiből archiválva : 2012. február 12..
  14. Jeremy Grossman. Speciális támadási technikák a Gmailt használó webalkalmazásokhoz  . fehér kalap biztonsági. Letöltve: 2009. szeptember 23. Az eredetiből archiválva : 2012. február 12..
  15. from __future__ import * » Remote JSON - JSONP . Bob.pythonmac.org. Letöltve: 2008. szeptember 8. Archiválva az eredetiből: 2012. február 12.
  16. Almeida, Jonas. JSON, JSONP, JSONPP?  (neopr.) . - S3DB, 2008. - június 11. Archiválva az eredetiből 2017. február 15-én.
  17. RIAspot. JSON P a Cross Site XHR-hez (nem elérhető link) . Az eredetiből archiválva: 2008. december 5. 
  18. Mikor használjunk strukturálatlan adattípusokat a PostgreSQL-ben? Hstore vs. JSON vs. JSONB  (orosz)  (2016. július 29.). Archiválva az eredetiből 2018. július 4-én. Letöltve: 2018. július 4.
  19. Miért jobb a PostgreSQL, mint a többi nyílt forráskódú SQL-adatbázis? 1. rész  (orosz)  (2016. április 29.). Archiválva az eredetiből 2018. július 4-én. Letöltve: 2018. július 4.

Linkek