Aplikacje internetowe korzystając z technologii AJAX prawie zawsze muszą wymieniać dane pomiędzy interfejsem użytkownika (JS, Flash itp) a serwerem (PHP, ASP itp).

Jak wiadomo nie można wprost przesłać np. tablicy czy obiektu z funkcji JS do skryptu PHP korzystając z obiektu XMLHttpRequest gdyż struktura takiej tablicy czy obiektu zostanie utracona. Należy więc dane jakoś przekształcić a najlepiej do pojedynczego łańcucha znaków. Dobrze byłoby gdyby po stronie przeglądarki w skryptach JS nie trzeba było korzystać z dodatkowych bibliotek niepotrzebnie powiększających ciężar strony. Ideałem byłoby gdyby format był zwięzły i w miarę czytelny. Spełnienie wszystkich tych życzeń wydaje się być nierealne a jednak!

Doskonałym rozwiązaniem okazuje się być format JSON (wymawiane jak imię "Jason" -- j?'s?n) oznacza JavaScript Object Notation czyli notacja obiektów JavaScript.
Po pierwsze niezależnie od typu dane po zakodowaniu są zawsze pojedynczym ciągiem znaków np.:

JavaScript:
  1. var jsonData = '{"a":{b:["c","d","e"],"f":{"g"}}}';

Po drugie aby odkodować format JSON wystarczy wykonać jego kod np. poprzez funkcję eval():

JavaScript:
  1. var myObject = eval(jsonData);

Po trzecie jak widać format jest zwięzły, czytelny i przez wielu uważany za bardziej naturalny niż np. XML.
Wszystkie te zalety sprawiają, że jest on bardzo często stosowany do wymiany danych nie tylko w modelu AJAX. Dla innych języków niż JS istnieją biblioteki do kodowania/dekodowania formatu JSON. Pełna ich lista znajduje się na stronie http://json.org/json-pl.html, na której można znaleźć także pełny opis tego formatu. Dla PHP istnieje nawet rozszerzenie json (wbudowane od wersji 5.2), dzięki czemu nie musimy korzystać z żadnych dodatkowych skryptów.

Format ten umożliwia przechowywanie dowolnych danych taki jak łańcuchy znaków, liczby, funkcje i całe obiekty wraz z właściwościami czy metodami dzięki czemu można bardzo wygodnie przesyłać dowolne dane pomiędzy np. skryptem PHP.odpowiadającym na żądanie funkcji JS. Warto pamiętać, iż ciągi znaków są przesyłane jako Unicode.

O ile odkodowanie danych z formatu JSON następuje poprzez funkcję eval() o tyle zakodowanie danych wymaga użycia dodatkowej funkcji, którą znaleźć można na stronie http://www.json.org/js.html. Osobiście nie jestem zadowolony z powyższego rozwiązania ponieważ polega ono na stworzeniu prototypu który "dokleja" się do danych po odkodowaniu dlatego polecam inne rozwiązanie czyli zwykłą funkcję (autor nieznany):

JavaScript:
  1. function toJsonString(o) {
  2.     var UNDEFINED
  3.     switch (typeof o) {
  4.         case 'string': return '"' + encodeJS(o) + '"'
  5.         case 'number': return String(o)
  6.         case 'object':
  7.             if(o) {
  8.                 var a = []
  9.                 if (o.constructor == Array) {
  10.                     for (var i = 0; i <o.length; i++) {
  11.                         var json = toJsonString(o[i])
  12.                         if(json != UNDEFINED) a[a.length] = json
  13.               }
  14.                     return '[' + a.join(',') + ']'
  15.                 } else if (o.constructor == Date) {
  16.                     return 'new Date(' + o.getTime() + ')'
  17.                 } else {
  18.                     for (var p in o) {
  19.                         var json = toJsonString(o[p])
  20.                         if (json != UNDEFINED) a[a.length] = (/^[A-Za-z_]\w*$/.test(p) ? ('"' + p + '":') : ('"' + encodeJS(p) + '":')) + json
  21.                     }
  22.                     return '{' + a.join(',') + '}'
  23.                 }
  24.             }
  25.             return 'null'
  26.         case 'boolean'  : return String(o)
  27.         case 'function' : return
  28.         case 'undefined': return 'null'
  29.     }
  30. }
  31. function encodeJS(s) {
  32.     return (!/[\x00-\x19\'\\]/.test(s)) ? s : s.replace(/([\\'])/g, '\\$1').replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/\t/g, '\\t').replace(/[\x00-\x19]/g, '')
  33. }

W PHP wykorzystując wbudowane bądź dodane rozszerzenie json można kodować/dekodować dane poprzez:

PHP:
  1. $data = json_decode($jsonData);
  2. $jsonData = json_encode($data);

Więcej o formacie JSON:
http://json.org/json-pl.html
http://pl.wikipedia.org/wiki/JSON
http://www.hunlock.com/blogs/Mastering_JSON_(_JavaScript_Object_Notation_)

Comments are closed.