Az előző példában láthattuk, hogy igencsak sokat kell gépelnünk ha XML-t szeretnénk JavaScripttel feldolgozni.
Ebben a példában bemutatom hogyan könnyíti meg a JSON az információcserét a kiszolgáló és a
kliens között.
A felhasználó e-mail címeket adhat egyesével egy listához.
A megadott e-mail cím kiszolgáló oldalon van ellenőrizve:
érvényes-e az e-mail cím?
nincs-e már ilyen e-mail cím a listában
A "Hozzáad" nyomógombra kattintva az XmlHttpRequest objektum segítségével egy GET HTTP lekérést küldünk a kiszolgálóhoz a begépelt
e-mail címmel.
A lekérésre a kiszolgáló a következők valamelyikét adja vissza a kliensnek:
hibaüzenet (érvényelen e-mail cím, vagy már van ilyen e-mail cím a listában)
ha nem történt hiba, akkor az új email címhez rendelt egyedi azonosító számot küldi vissza
A probléma tehát az, hogy a kiszolgáló milyen formában küldje vissza ezt az információt.
A visszaadott válasz nem mindig ugyanaz, egyszer egy szám, más alkalommal pedig valamilyen hibaüzenet lehet.
Ez azt jelenti, hogy a kliensnek tudnia kell, hogy a válasz hibaüzenet vagy valami más.
Természetesen ebben az egyszerű példában a válasz lehetne egy előre lefektetett konvenció alapján formátozott
sztring is (az XmlHttpRequest objektum responseText attribútuma), de ezt is nehézkes lenne feldolgozni.
Bonyolultabb adatstruktúráknál kénytelenek lennénk XML-t használni, hacsak nem ismerjük a JSON-t.
A JSON a JavaScript Object Notation rövidítése. Feladata, hogy struktúrákat írjon le.
Elsősorban az Ajax alapú kommunikációk esetében használják, mivel a JSON jóval tömörebb, mint az XML
(JSON: The Fat-Free Alternative to XML).
A kiszolgálótól kapott válasz egy karakterlánc, amit az XmlHttpRequest objektum responseText attribútumával kérhetünk le.
A kiszolgáló JavaScript objektum definíciós kódot küld vissza. Ez valójában egy szerializált objektum deklaráció,
amit a JavaScript eval utasításával lehet deszerializálni, azaz létrehozni az objektumot.
eval('var oResponse ='+ oXmlHttp.responseText)
if (oResponse.error){
alert("Hiba: "+ oResponse.error);
}else{
oResponse.emailID
}
Látható, hogy a visszakapott üzenetet egyáltalán nem kell parszolni és tetszőleges számú kulcs-értéket lehet definiálni.
Két kérdés azonban felmerül:
JavaScript oldalon az eval utasítással tudjuk elvégeztetni a JSON módon adott JavaScript-kódot.
Létezik hasonló PHP utasitás is ?
Az adattípusok elvesznek azaz minden kulcs-érték karakterlánc típusú.
Számos PHP/JavaScript könyvtár született, amelyek maximálisan leegyszerűsítik a JSON üzenetek küldését ill.
fogadását és természetesen megoldással szolgálnak a fenti problémákra is.
Néhány közülük:
A felhasználó e-mail címeket adhat egyesével egy listához. A megadott e-mail cím kiszolgáló oldalon van ellenőrizve:
- érvényes-e az e-mail cím?
- nincs-e már ilyen e-mail cím a listában
A "Hozzáad" nyomógombra kattintva az XmlHttpRequest objektum segítségével egy GET HTTP lekérést küldünk a kiszolgálóhoz a begépelt e-mail címmel. A lekérésre a kiszolgáló a következők valamelyikét adja vissza a kliensnek:- hibaüzenet (érvényelen e-mail cím, vagy már van ilyen e-mail cím a listában)
- ha nem történt hiba, akkor az új email címhez rendelt egyedi azonosító számot küldi vissza
A probléma tehát az, hogy a kiszolgáló milyen formában küldje vissza ezt az információt. A visszaadott válasz nem mindig ugyanaz, egyszer egy szám, más alkalommal pedig valamilyen hibaüzenet lehet. Ez azt jelenti, hogy a kliensnek tudnia kell, hogy a válasz hibaüzenet vagy valami más. Természetesen ebben az egyszerű példában a válasz lehetne egy előre lefektetett konvenció alapján formátozott sztring is (az XmlHttpRequest objektum responseText attribútuma), de ezt is nehézkes lenne feldolgozni. Bonyolultabb adatstruktúráknál kénytelenek lennénk XML-t használni, hacsak nem ismerjük a JSON-t.A JSON a JavaScript Object Notation rövidítése. Feladata, hogy struktúrákat írjon le. Elsősorban az Ajax alapú kommunikációk esetében használják, mivel a JSON jóval tömörebb, mint az XML (JSON: The Fat-Free Alternative to XML).
A kiszolgálótól kapott válasz egy karakterlánc, amit az XmlHttpRequest objektum responseText attribútumával kérhetünk le. A kiszolgáló JavaScript objektum definíciós kódot küld vissza. Ez valójában egy szerializált objektum deklaráció, amit a JavaScript eval utasításával lehet deszerializálni, azaz létrehozni az objektumot.eval('var oResponse ='+ oXmlHttp.responseText)if (oResponse.error){
alert("Hiba: "+ oResponse.error);
}else{
oResponse.emailID
}
Látható, hogy a visszakapott üzenetet egyáltalán nem kell parszolni és tetszőleges számú kulcs-értéket lehet definiálni. Két kérdés azonban felmerül:
- JavaScript oldalon az eval utasítással tudjuk elvégeztetni a JSON módon adott JavaScript-kódot.
Létezik hasonló PHP utasitás is ?
- Az adattípusok elvesznek azaz minden kulcs-érték karakterlánc típusú.
Számos PHP/JavaScript könyvtár született, amelyek maximálisan leegyszerűsítik a JSON üzenetek küldését ill. fogadását és természetesen megoldással szolgálnak a fenti problémákra is. Néhány közülük: