Hello, I am Andrei. I develop.

idevelop.ro: intelligent web solutions

Introducere in JSON (JavaScript Object Notation)

Introducere in JSON (JavaScript Object Notation)

Introducere

Aplicatiile web se bazeaza din ce in ce mai mult pe javascript pentru transferul de informatii intre serverul web si browserul vizitatorului. Aceste informatii pot fi trimise fie plain-text, fie serializate intr-un obiect JSON, fie intr-o structura XML. Pentru ca datele trimise de server sa poata fi utilizate in cadrul javascript-ului, ele trebuie extrase cumva din string-ul responseText. Aceasta operatie de extragere a informatiilor dintr-un text care respecta o anumita sintaxa (bine definita) se cheama parsare.

Cum ii spune si numele, JSON este o notatie, o sintaxa care descrie felul in care sunt incapsulate obiecte (array-uri, stringuri, numere, etc) intr-un anumit format, dupa reguli bine stabilite.

XML-ul nu este un format nativ javascript, sintaxa lui nu are sens intr-un cod sursa .js, de aceea este nevoie de un set de functii in plus pentru extragerea datelor venite in acest format, ceea ce mareste timpul de procesare.
Sintaxa JSON insa, este perfect compatibila cu javascript. Stringul primit de la server nu trebuie decat evaluat (cu functia eval()) si este automat transformat in variabila. Nu este necesara folosirea niciunei librarii externe. Functia eval() executa stringul dat ca parametru ca si cum ar fi cod javascript.

Un exemplu de string cu sintaxa JSON:

{
	"numeMagazin" : "SC Gigel impex SRL",
	"produse" : [
		{ "nume" : "Tricou", "cantitate" : 2, "pret" : 120 },
		{ "nume" : "Telefon", "cantitate" : 6, "pret" : 500 },
		{ "nume" : "Creion", "cantitate" : 10, "pret" : 20 }
	],
	"adresa" : "Strada Primaverii nr. 3"
}

O structura echivalenta in XML ar fi:

<?xml version='1.0' encoding='UTF-8'?>
	<numeMagazin>SC Gigel impex SRL</numeMagazin>
	<produse>
		<produs>
			<nume>Tricou</nume>
			<cantitate>2</cantitate>
			<pret>120</pret>
		</produs>
		<produs>
			<nume>Telefon</nume>
			<cantitate>6</cantitate>
			<pret>500</pret>
		</produs>
		<produs>
			<nume>Creion</nume>
			<cantitate>10</cantitate>
			<pret>20</pret>
		</produs>
	</produse>
	<adresa>Strada Primaverii nr. 3</adresa>
</xml>

Utilizare

Dinspre PHP, un string valid JSON se poate genera manual, dar cel mai usor este sa folosim o clasa care stie sa transforme orice variabila PHP (simpla, array, etc) direct in sintaxa JSON, gata sa fie trimisa browserului. Incepand cu versiunea 5.2.0, PHP vine cu o extensie care se ocupa atat de codarea cat si de decodarea obiectelor JSON. Pentru versiunile mai vechi de PHP se poate folosi o clasa din multele disponibile.

Exemplu de utilizare din PHP, folosind functia json_encode(), disponibila in PHP 5.2.0:

$array = array(
	"persoana" => array (
		"nume" => "Andrei",
		"varsta" => 20,
		"email" => "andrei@idevelop.ro"
	)
);

echo json_encode($array);
{"persoana":{"nume":"Andrei","varsta":20,"email":"andrei@idevelop.ro"}}

In javascript, dupa cum am spus, ne ajuta foarte mult suportul nativ. Deoarece acel string este, in esenta, o instructiune javascript, el nu trebuie decat evaluat si devine automat o variabila.

var rezultat = eval('(' + ajax.responseText + ')');
// in acest moment, "rezultat" este un obiect javascript
alert(rezultat.persoana.nume); // va afisa "Andrei"

Obiectul astfel obtinut poate fi parcurs exact ca orice array, elementele sale putand fi la randul lor array-uri, etc. Pentru primul exemplu, cel cu magazinul, afisarea tuturor produselor se poate face in felul urmator:

var magazin = eval('(' + ajax.responseText + ')');
for (var k=0; k<magazin.produse.length; k++) {
	alert(magazin.produse[k].nume);
}

Pentru a vedea pe viu ce si cum se intampla, am creat o pagina demonstrativa:

Exemplu de utilizare JSON: un exemplu de prelucrare a unui string JSON

JSON versus XML

Cum am vazut, atat JSON cat si XML nu sunt decat sintaxe in care sunt invelite, intr-un mod structurat, informatiile. De ce am folosi unul si nu celalalt? Ca de obicei, parerile sunt impartite si exista avantaje si dezavantaje in ambele cazuri.

Avantajele JSON

  • Parsarea unui obiect JSON in javascript este mult mai rapida decat parsarea acelorasi informatii impachetate intr-o structura XML, datorita suportului nativ.
  • Parcurgerea informatiilor obtinute este de asemenea mult mai usoara decat folosind functii XML gen childNodes() sau nextChild().
  • Datorita sintaxei simple, dimensiunea unui raspuns AJAX in forma JSON va fi mult mai mica in comparatie cu un XML stufos, cum puteti vedea si in exemplul de mai sus.

Avantajele XML

  • Este mult mai raspandit, exista multe implementari de parsere si generatoare pentru majoritatea limbajelor de programare existente
  • XPath, XSLT

Securitate

Atata timp cat sunteti siguri ca serverul care trimite datele in format JSON este de incredere, totul este ok (desi, teoretic, este posibil ca pachetele sa fie interceptate intr-un punct intermediar si inlocuite cu altele, deoarece informatiile sunt trimise plain-text, fara criptare).

Daca insa trebuie sa parsati cod venit de la un alt site (cum trimite, de exemplu, jobber pentru widgetul sau) asupra caruia nu aveti control, pot aparea probleme de securitate. Daca cineva compromite serverul jobber si introduce in codul javascript trimis spre widget instructiuni malitioase, acestea vor fi executate de catre functia eval() in browserul vizitatorului. In acest caz, pentru intarirea securitatii, este bine sa folosim un JSON Parser, o functie care parseaza doar codul JSON din textul primit, ignorand instructiunile javascript.

O alta problema de securitate este javascript hijacking, dar mai multe despre asta intr-un articol viitor :).

Linkuri utile

Pune un comentariu Dezvoltare client-side, Programare web
Trackback

Linkuri catre acest post

16 comentarii Subscribe to Comments RSS

  1. cool

  2. duuuude, you RULE :D felicitări pentru post

  3. foarte bine scris. un excelent punct de plecare pentru cei ce vor sa aprofundeze

  4. Sa speram ca nu hackareste nimeni serverul jobber :p.

    Andrei, un intro excelent in JSON! Stii ce ar fi interesant pentru urmatorul articol? Un studiu de caz cu un exemplu simplu de Ajax request / JSON response.

  5. Un articol foarte bun, tin sa precizez ca avantajele xml fac o diferenta doar la aplicatiile medii si mari, unde exista posibilitatea sa fie externalizat continutul aplicatiei si pe alte platforme (de exemplu intr-o aplicatie scrisa in c++).

  6. Ma bucur ca v-a placut :).

    Filip, am de gand sa aprofundez subiectul securitatii in “era web 2.0″ intr-un post viitor, si poate cu ocazia aia fac si un request ajax mic ;)

  7. Foarte buna introducerea in JSON.
    Polemica asta cu JSON vs. XML exista cam de multicel si fiecare parte isi are adeptii. Eu cred totusi exportul de date in XML respectiv JSON trebuie ales in funtie de necesitate: daca vrei sa exporti un document care contine mult text, in care pozitia elementelor conteaza si trebuie respectata vei exporta datele in XML. Daca insa ai nevoie sa trimiti niste structuri de date de ici-colo (si exemplul tau este foarte clar) atunci JSON e alegerea.
    Un alt atu al XML-ului este ca poti specifica modul de codare al caracterelor (utf-8, iso-8859-1, etc).

  8. mda, avantajul de baza a XML e ca-l poate intepreta orice alt limbaj, dar cand nu te intereseaza lucrul asta…

  9. Iulian, corect. Atat XML cat si JSON sunt doar unelte, in final trebuie puse in balanta atat avantajele cat si dezavantajele fiecaruia si trebuie aleasa unealta care serveste cel mai bine scopului. De prea multe ori tehnologiile sunt folosite aiurea si apar aberatii de site-uri “web 2.0″, fara cap si fara coada, dar care “sunt cu AJAX“.

  10. Excelent!

  11. Fain articol, multumesc!

  12. Ce pot sa spun…
    Ai postat mai bine de un an jumate si eu acum citesc pentru prima oara de json… Nici nu vreau sa-ti spun cat de “la momentul oportun” am dat de chestia asta si ce repede am sorbit subiectul… Habar n-aveam de json si n-ai idee cata bataie de cap o sa-mi salveze la concretizarea proiectului meu. Excelent… mi-ai facut o dimineatza faina :)))

    PS – imi cer scuze dar nu-mi las adresa de mail aiurea peste tot :P

  13. am instalat o versinea de firefox 2.0,, dezinstaland v 3.0 si aM pierdut bookmarkurile. Ele totusi exista in format json, in backup.
    Cum as putea sa transform ultimul bookmark.json salvat de firefox ieri, in bookmark.html pt ca sa-l suprascriu peste bookmark.html oferit implicit de firefox?
    multumesc pentru atentie

  14. riuss, prima solutie care imi vine in minte e sa incarci datele intr-un php cu json_decode(file_get_contents(‘bookmark.json’)) devenind astfel un array php pe care il poti parcurge, etc, si apoi sa il afisezi la loc in formatul specific bookmark.html, te uiti si tu care e structura html-ului.

    ori asta, ori cauti pe net daca exista vreun convertor automat pe net pentru treaba asta :). iata: http://kb.mozillazine.org/Lost_bookmarks#Importing_a_bookmark_backup_file

Pune un comentariu