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ʒ eɪ 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.
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().
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>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 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:
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] .
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] .
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 .
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.
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.
A webböngészők legújabb verziói beépített JSON-támogatással rendelkeznek, és képesek feldolgozni azt.
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 .
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.
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] .
Dokumentum jelölőnyelvek | |
---|---|
irodai dokumentumok | |
közismert | |
Kevésbé ismert |
Web és weboldalak | |
---|---|
globálisan | |
Helyileg | |
Webhelyek és szolgáltatások típusai |
|
Alkotás és karbantartás | |
Elrendezések, oldalak, webhelyek típusai | |
Műszaki | |
Marketing | |
Társadalom és kultúra |