Mootools 1.1 - Json.js

22 lipca, 2007

JSON to format wymiany danych, który moim zdaniem naprawdę warto poznać, zwłaszcza w kontekście bardziej zaawansowanego użycia skryptów JavaScript na stronie. Do czego możemy użyć tego formatu ? Możemy elegancko wymieniać złożone dane pomiędzy PHP, a JavaScript - oczywiście nie tylko PHP posiada wsparcie dla JSON - posiada je mnóstwo języków programowania co zresztą sami zobaczycie czytając podlinkowaną na początku wpisu stronę. Dzięki JSON uzyskujemy łatwy dostęp do poszczególnych elementów obiektu danych.

Mootools w pliku json.js posiada dwie metody składowe klasy Json - toString i evaluate - pierwsza zamienia obiekt JavaScript na ciąg znaków, a druga zamienia ciąg znaków na obiekt JavaScript. Dzięki temu możemy używać przechowywać złożone dane na przykład w cookies - zapisujemy obiekt konfiguracji jako ciąg znaków, który umieszczamy w ciasteczku, a następnie możemy tenże obiekt w dowolnym momencie odczytać.

Nie muszę chyba mówić, że zapis konfiguracji w postaci takiego obiektu:

{
   "styl": 1,
   "nick": 'Dziudek'
}

Jest łatwiejszy do ponownego użycia niż jakiś ciąg znaków, który można odczytać tylko na znany autorowi skryptu sposób ;)

Oczywiście format JSON to nie tylko obiekty - to także tablice i ciągi znaków - wszystkie informacje na ten temat zawarte są na wspomnianej już stronie o JSON.

Warto dodać, że PHP posiada identycznie działające metody jak mootools - json_decode i json_encode, różnica polega na tym, że po stronie PHP obiekty JavaScript są tablicami.

toString

Metoda toString jak już wspomniałem zamienia obiekt na ciąg znaków. Składnia tej metody jest oczywiście nieskomplikowana, gdyż pobiera ona tylko jeden argument - obiekt do przetworzenia:

Json.toString(obiekt);

Powyższy zapis zwróci nam nasz obiekt zamieniony na ciąg znaków, przykładowo:

Json.toString({styl: 'red', nick: 'Dziudek'}});

Ten zapis zwróci nam taki oto ciąg znaków:

'{"styl":"red","nick":"Dziudek"}'

I taki ciąg możemy już śmiało zapisywać w ciasteczku lub wysyłać jakiemuś skryptowi PHP do przetworzenia...

To pora na jakiś mały przykład - wykorzystamy przy tym naszą wiedzę o pliku cookie.js (poprzednia część kursu).

Stworzymy skrypt, który zapisze kilka danych z prostego formularza w ciasteczku. Przyjmijmy, że te dane to preferowana kolorystyka strony nick użytkownika i krótka notatka.

Całość będzie polegała na odczytaniu wartości poszczególnych pól formularza i zapisaniu ich w obiekcie. Następnie obiekt ten zostanie zamieniony na ciąg znaków i zapisany w cookie.

Do tego dołożymy przycisk, który pokaże nam zawartość ciasteczka, ale na razie bez dekodowania jej do postaci pierwotnej.

Tworzymy obiekt, w którym to wszystko zapiszemy:

var dane = {
   styl: '',
   nick: '',
   notatka: ''
}

Następnie tworzymy zdarzenie onclick przycisku wykonującego całą operację:

$('btn-save').addEvent('click',function(){
   dane.styl = $('form-styl').getValue();
   dane.nick = $('form-nick').getValue();
   dane_notatka = $('form-notatka').getValue();

   Cookie.set('dane',Json.toString(dane),{duration: 10,path: "/"});
});

I do tego przycisk, który wczyta nam zawartość ciasteczka do wybranego diva:

$('btn-read').addEvent('click',function(){
   $('cookie-content').setHTML(Cookie.get('dane'));
});

I cały powyższy kod w akcji:

PRZYKŁAD 1

evaluate

Metoda evaluate ma działanie odwrotne do metody toString - zamienia ciąg znaków w obiekt formatu JSON. Pobiera dwa argumenty - ciąg znaków do przetworzenia i parametr decydujący o tym czy ma być sprawdzana poprawność podanego ciągu znaków.

W wypadku gdy pierwszy argument nie jest ciągiem znaków, bądź jest niepoprawnym zapisem formatu JSON i drugi argument jest ustawiony jako true to zwrócona zostanie wartość false.

Składnia metody evaluate:

Json.evaluate('{obiekt}',secure);

Rozbudujmy zatem nasz przykład od kod, który odczyta elegancko zawartości ciasteczka.

Zmienimy jedynie kod funkcji przypisanej jako zdarzenie onclick przycisku btn-read:

$('btn-read').addEvent('click',function(){    var dane = Json.evaluate(Cookie.get('dane'));
   var string = '<strong>Styl:</strong>' + dane.styl + '<br />';
   string += '<strong>Nick:</strong>' + dane.nick + '<br />';
   string += '<strong>Notatka:</strong> ' + dane.notatka + '<br />';
   $('cookie-content').setHTML(string);
});

Poniżej zmieniony kod:

PRZYKŁAD 2

Jak widać plik json.js mimo zaledwie dwóch metod jakie zawiera, otwiera przed nami zupełnie nowe możliwości przekazywania, przechowywania i pobierania danych.

W następnej części kursu omówimy plik Json.Remote.js - ostatni z plików grupy Remote.

Komentarze do wpisu "Mootools 1.1 - Json.js":

1. Wiraż napisał(a):
01 września 2007, 16:31:07

wole prototype js tez ma wsparcie dla json

2. Dziudek napisał(a):
01 września 2007, 16:34:22

@Wiraż – każdy może lubić to co chce, ja wolę mootools chociażby za ogromne możliwości animowania elementów dokumentu – prototype z tego co kojarzę tego nie ma, a dziś jest to bardzo ważny element wielu stron…

3. Visa napisał(a):
11 września 2007, 21:32:22

prototype js jest lepszy w moim odczuciu pod kazdym wzgledem, ale nie pod tymi wzgledami ktorych nie ma a mootools ma ! Animacje to jest wazne. Prototype i np style.opacity filter:alpha style.Moz-opacity masz juz problemy robisz pod kazda przegladarke a tu jedziesz raz setOpacity i masz to gdzies.. to samo z innymi watkami ale np choc pobieranie wysokosci i szerokosci elemenu w prototype js jest lepsze mootools jak element jest display none to niemoge dostac sie do jego rozmiarow getSize x, y zwraca mi 0 i niefart

4. Dziudek napisał(a):
11 września 2007, 21:41:09

@Visa – według mnie samo porównywanie MooTools i prototype jest troszkę bezsensowne – prototype jest „troszkę” starsze niż MooTools ;) Jeszcze wiele rzeczy jest w moo do zrobienia :) Mimo to bardzo lubię ten framework i nie zdarzyło mi się by mnie jakoś poważnie zawiódł.

5. Anonim napisał(a):
25 grudnia 2007, 23:02:25

A to co nie mozna porownywac bo jest troche starsze?

6. Dziudek napisał(a):
26 grudnia 2007, 00:02:44

@Anonim – prototype i MooTools to dwie różne bajki tak naprawdę jeżeli chodzi o frameworki JS… Poza tym jak chcesz porównywać najstarszy framework JS i młody tak naprawdę kształtujący się dopiero projekt ? Parę miesięcy różnicy w wieku skryptu to wbrew pozorom bardzo dużo…

Dodaj komentarz:

Textile Lite włączony ( szczegółowy opis znaczników ):
*strong* | # lista numerowana | * lista wypunktowana | _em_ | __italic__ | "link":http:// | bq. cytat.