A JSON (ejtsd: dzsézön vagy dzséjszön a Jason névhez hasonlóan, IPA: vagy ; a betűszó az angol JavaScript Object Notation rövidítése, am. JavaScript objektumjelölés) egy egyszerű, ember által is olvasható szöveg alapú szabvány számítógépek közötti adatcserére. A JavaScript szkriptnyelvből alakult ki egyszerű adatstruktúrák és asszociatív tömbök (a JSON-ban „objektum” a nevük) reprezentálására. A JavaScripttel való kapcsolata ellenére nyelvfüggetlen, a legtöbb nyelvhez van értelmezője.

A JSON hivatalos MIME-típusa application/json. Fájlként a kiterjesztése .json.

A JSON-t legtöbbször egy szerver és egy kliens számítógép közti adatátvitelre használják (legtöbbször AJAX technológiával). Általánosságban strukturált adatok tárolására, továbbítására szolgál. A téradatok leírására és tárolására szolgáló változata a GeoJSON.

Az XML legfőbb alternatívája.

Története Douglas Crockford volt az első, aki meghatározta és népszerűsítette a JSON formátumot.Video: Douglas Crockford — The JSON Saga a Yahoo! Developer Networkön. A videóban Crockford a következőket mondja: „Nem állítom, hogy a JSON-t feltaláltam... Amit tettem, az az, hogy megtaláltam, elneveztem, leírtam, hogyan hasznos... Tehát az ötlet már ott volt egy ideje... Amit tettem, az, hogy adtam egy specifikációt és egy kis weboldalt [a JSON-nak].” ("I do not claim to have invented JSON... What I did was I found it, I named it, I described how it was useful... So the idea's been around there for a while. What I did was I gave it a specification, and a little website.")

A JSON-t a State Software, egy többek között Crockford alapította cég használta körülbelül 2001-től. A JSON.org honlap 2002-ben indult el. 2005 decemberében a Yahoo! elkezdte némely webes szolgáltatásait JSON-ban kínálni. A Google a GData webes protokolljának 2006 decemberében kezdett JSON feedeket kínálni.

Habár a JSON alapja a JavaScript szkriptnyelv egy részhalmaza (konkrétan az ECMA-262 3rd Edition—December 1999 standard) és gyakran használják a JavaScript programokban, a JSON programnyelvfüggetlen. JSON adatok értelmezésére és generálására igen sok programozási nyelv ad kész eszközöket. A JSON weboldalán található egy összefoglaló lista arról, hogy mely nyelvekhez vannak JSON-könyvtárak.

Adattípusok és szintaxis A JSON alap adattípusai:

Szám: double a JavaScriptben, általánosságban implementációfüggő string: Karakterlánc idézőjelek közt, Unicode karakterekből (alapértelmezetten UTF-8 kódolásban) backslash-t (\) használva escape karakterként Boolean: true (igaz) vagy false (hamis) Tömb: értékek kötött sorrendű felsorolása (listája) vesszővel elválasztva, szögletes zárójelek között; az értékek lehetnek különböző típusúak Objektum: kulcs: érték-párok rendezetlen halmaza, amelyben : kettőspont karakter választja el a kulcsot és az értéket. A párok egymástól vesszőkkel vannak elválasztva. A teljes lista {} kapcsos zárójelek között van. A kulcsok mindig string típusúak, ezért idézőjelek között állnak. A JSON szintaxis nem ír elő semmilyen korlátozást a névként használt karakterláncokra, nem követeli meg, hogy a névkarakterláncok egyediek legyenek, és nem tulajdonít semmilyen jelentőséget a név/érték párok sorrendjének. Ezek mind olyan szemantikai megfontolások, amelyeket a JSON-processzorok határozhatnak meg, vagy a JSON adatcseréhez való konkrét felhasználását meghatározó specifikációkban. A JSON specifikációnak a célja csak az érvényes JSON-szövegek szintaxisának meghatározása. Ugyanakkor több elterjedt kezelő szoftver bevezetett korlátozásokat, vagy előírt sorrendiséget, amely korlátozza a szintaxis specifikáció eredeti rugalmasságát. üres: null

A feldolgozó által figyelmen kívül hagyott whitespace hozzáadható a „strukturáló karakterek” (pl. [], {}, :, ,) előtt vagy után.

Példa A következő példa egy személyt leíró objektum JSON-os reprezentációja. Az objektum a vezetéknév és a keresztnév számára string típusú mezőket hagy, az életkornak számot, valamint tartalmaz egy címet reprezentáló objektumot (asszociatív tömböt) és egy tömböt (listát), amely a telefonszámokat reprezentáló objektumokat (asszociatív tömböket) tartalmazza.

{ "vezetekNev": "Kovács", "keresztNev": "János", "kor": 25, "cim":

"utcaHazszam": "2. utca 21.", "varos": "New York", "allam": "NY", "iranyitoSzam": "10021" }, "telefonSzam": [

"tipus": "otthoni", "szam": "212 555-1234" },

"tipus": "fax", "szam": "646 555-4567"

]

Mivel a JSON a JavaScript részhalmaza, lehetséges (de biztonsági okokból nagyon nem ajánlott) a JSON szöveg objektummá való konvertálása a JavaScriptben található eval() függvénnyel. Például, ha a fenti JSON adat egy JavaScriptes string változóban van, melynek neve contact, p JavaScript objektumba lehet konvertálni a következőképp: var p = eval("(" + contact + ")"); A contact változónak azért kell zárójelek között lennie, hogy elkerülje a JavaScript szintaxisban a kétértelműségét.

Mindazonáltal az ajánlott út a JSON-értelmezők használata. Ha a kliens teljes mértékben megbízik a szöveg forrásában vagy valami okból nem tökéletes szintaxisú JSON-t kell elfogadnia, csak akkor ajánlott az eval() használata. Egy jól implementált JSON-értelmező csak a hibátlan JSON-t fogadja el, és megakadályozza ezáltal a veszélyes kódok lefutását.

A modern böngészők, mint például a Firefox 4 és az Internet Explorer 8 tartalmaznak speciális lehetőségeket a JSON értelmezésére. Mivel a natív böngészős támogatás hatékonyabb és biztonságosabb, mint az eval() használata, a natív JSON-támogatás benne van a nemrégiben kiadott ECMAScript standard 5. kiadásában.Standard ECMA-262

Nem támogatott natív adattípusok

A JavaScript szintaxisa számos, JSON-ban nem megtalálható adattípust definiál:Az RFC4627 dátum (Date), hiba (Error), matematikai (Math), reguláris kifejezés (Regular Expression) és függvény (Function). Ezeket a JavaScript-adattípusokat más adatformátumban kell reprezentálni, ahol a küldő és a fogadó oldal is ugyanúgy konvertálja. Jelenleg (2011-ben) vannak de facto szabványok, mint például a Date és a String közti konverzió, ám egyiket sem ismerik el általánosan.jquery - How to format a JSON date? - Stack Overflow Más programnyelvek más, konvertálandó natív adattípusokkal rendelkezhetnek, amelyeket szerializálni kellhet az ilyen konverziók előtt.

Séma Számos út van a JSON objektum struktúrájának és adattípusainak ellenőrzésére, amelyek az XML-sémára hasonlítanak, mindazonáltal az XML sémáknál a JSON-sémákat kevésbé használják széleskörűen. Ráadásul az XML-sémákkal ellentétben a JSON-sémákat kézzel kell megírni, jelenleg nincsen olyan elérhető eszköz, amely a JSON-adatokból JSON-sémát generálna.

A JSON-séma (JSON Schema)JSON Schema egy JSON-alapú specifikáció a JSON-adatok formátumának leírására. A JSON-sémával létrehozható egy egyezmény, hogy milyen adat szükséges és mindaz milyen típusú kell, hogy legyen, nagyon hasonlóan az XML-hez való XML-sémához. A JSON Schema célja a JSON-adatok ellenőrzése, dokumentációja és interakció-szabályozás. A JSON-séma az XML Schemán, a RelaxNG-n és a Kwalify-on alapszik, de célul tűzte ki a JSON-alapúságot is, tehát a JSON-adatok validálásához használható séma formája a meglevő JSON, egyazon szerializáló eszköz használható a sémához és az adathoz, és leírhatja önmagát.

A JSON-séma egy IETF draft (vázlat) formájában íródott, amely 2011-ben lejárt.JSON Schema draft 3 Mindazonáltal számos validáló érhető el különböző programnyelvekre, mindegyik különböző megfelelőségi szintekkel. Jelenleg a legteljesebb és legmegfelelőbb JSON-séma ellenőrző a JSV (JSON Schema Validator).JSV: JSON Schema Validator

Példa JSON-séma: { "name": "Termek", "properties":

"id":

"type": "number", "description": "Termékazonosító", "required": true }, "nev":

"type": "string", "description": "Terméknév", "required": true }, "ar":

"type": "number", "minimum": 0, "required": true }, "cimkek":

"type": "array", "items":

"type": "string"

}, "keszlet":

"type": "object", "properties":

"raktar":

"type": "number" }, "kereskedo":

"type": "number"

A fenti JSON-séma használható például az alábbi adatok validálására:

{ "id": 1, "nev": "Foo", "ar": 123, "cimkek": ["Bar","Eek"], "keszlet": { "raktar": 300, "kereskedo": 20 } }

MIME-típus A JSON-szöveg hivatalos MIME-típusa application/json.IANA | Application Media Types

Használat az Ajaxban A JSON-t gyakran használják az Ajax technológiában. Az Ajax lehetővé teszi, hogy a weblap teljes újratöltődés nélkül kis mennyiségű adatot cseréljen a szerverrel, és ennek hatására frissüljön. Az adat rögtön megjelenik a felhasználó számára, amint megérkezik a szerverről. Például a gyakorlatban ez lehet a következő: egy felhasználó egy szövegdobozba ír valamit egy keresőben, a kliensoldal elküldi, mit írtak be mindeddig, míg a szerver válaszol a lehetséges teljes keresőszavak listájával. Ezek megjelenhetnek egy legördülő listában a keresés alatt, míg a felhasználó pedig esetlegesen befejezi az írást, és kiválasztja valamelyik gyakran használt keresőkifejezést közvetlenül. Az eredeti leírásakor a 2000-es évek közepén az Ajax általánosságban XML-t használt adatformátumként (az Ajax az Asynchronous Javascript and XML rövidítése), ám több fejlesztő JSON-t használt az adatátvitelre a szerver és a kliens között.

A következő JavaScript-kód egy példa az XMLHttpRequest használatára az adatok JSON-lekérésével. (A szerveroldali programozási rész kihagyva; úgy kell felállítani, hogy az URL-re intézett kérésre egy JSON-formátumú stringgel válaszoljon.)

var my_JSON_object = {}; var http_request = new XMLHttpRequest(); http_request.open("GET", url, true); http_request.onreadystatechange = function () { var done = 4, ok = 200; if (http_request.readyState == done && http_request.status == ok) { my_JSON_object = JSON.parse(http_request.responseText);

http_request.send(null);

Biztonsági problémák

Habár a JSON egy adatformátum, JavaScriptbe épülése számos biztonsági problémát vet fel, amennyiben JavaScript értelmezőt használunk (eval). Ezzel a módszerrel veszélyes szkript is lefuthat, ami gyakori probléma az internetről érkező JSON-adatok esetében. Bár van más módszer is a JSON adatok értelmezésére, egyszerű és gyors mivolta miatt gyakran használják. A következő fejezetben erre olvashatók példák.

JavaScript eval() Mivel a JSON-formázott szöveg szintaktikailag érvényes JavaScript-kód, a JSON-értelmezésének egy egyszerű lehetséges eljárása a JavaScriptbe beépített eval() függvény használata, amely a JavaScript-kifejezések kiértékelésére szolgál. A JSON-értelmező helyett magát a JavaScript interpretert használják a JSON adatok "lefuttatására", amely ezáltal natív JavaScript-objektumokat hoz létre. Mindazonáltal vannak olyan Unicode-karakterek, amelyek érvényesek JSON-ban, de érvénytelenek JavaScriptben, tehát extra escape-elés szükséges a JavaScript interpreterek használata előtt.

Amennyiben elővigyázatossági intézkedések nélkül az eval() függvényt használja egy programkód, akkor biztonsági réseket okozhat az eval-os eljárás, ha az adat és a teljes JavaScriptes rendszer nem áll egyetlen, megbízható forrás ellenőrzése alatt. Például, ha az adat nem megbízható, akkor az érkező adat lehetséges, hogy egy JavaScriptes kódbeszúrásos támadást idéz elő. Emellett a bizalom ilyen megsértése okozhat adatlopást, autentikáció-hamisítást, és az adatok és erőforrások egyéb rossz használatát. A reguláris kifejezések használhatók az adatok validálására eval() esetén. Például a JSON-t definiáló RFC, az RFC 4627 a következő kódot javasolja a JSON eval()-ozása előtt használni (a „text” változó a bemeneti JSON-kód):

var my_JSON_object = !( /[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( text.replace(/"(\\.|[^"\\])*"/g, '') ) ) && eval('(' + text + ')');