PHP и JSON

JSON это простой формат для сериализации данных в javascript, т.е. представления пременных в виде строки. Аналогично в php например есть функция serialize(), а в Java - RMI, в .NET - COM (если я не ошибаюсь), ну а в обобщённом виде - XML.

Лёгкий вес

Когда php-программисты ещё не знали о лёгком весе JSON, то для переносимости формата использовали XML. Так делает например FCKeditor до сих пор при получении списка в ресурс-менеджере. Ещё как есть плохой вариант - передавать сразу готовый HTML код. Но размер лишних данных в таком случае растёт в линейной прогрессии с коэффициентом полезные данные/тэги HTML.

Генерация в PHP

На серверной части в php 4 по умолчанию json отключён, но его можно попробовать включить..

dl(json.so);

$strToSend=json_encode($objToEncode);

Ещё вариант - использовать объект Services_JSON из громоздкого PEAR.

require_once('json.php');

$json = new Services_JSON();
$strToSend=$json->encode($objToEncode);

Но как правило первый вариант не работает, а второй странно ведёт себя с кодированием utf8. Поэтому мне пришлось немного дописать функцию до варианта, правильно кодирующий new-line символы:

function array2json($arr) {
  $parts = array();
  $is_list = false;
  if (!is_array($arr)) return;
  if (count($arr)<1) return '{}';

  //Find out if the given array is a numerical array
  $keys = array_keys($arr);
  $max_length = count($arr)-1;
  //See if the first key is 0 and last key is length - 1
  if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {
    $is_list = true;
    for($i=0; $i<count($keys); $i++) { //See if each key correspondes to its position
      if($i != $keys[$i]) { //A key fails at position check.
        $is_list = false; //It is an associative array.
        break;
      }
    }
  }

  foreach($arr as $key=>$value) {
    if(is_array($value)) { //Custom handling for arrays
      if($is_list) $parts[] = array2json($value); /* :RECURSION: */
      else $parts[] = '"' . $key . '":' . array2json($value); /* :RECURSION: */
    } else {
      $str = '';
      if(!$is_list) $str = '"' . $key . '":';

      //Custom handling for multiple data types
      if(is_numeric($value)) $str .= $value; //Numbers
      elseif($value === false) $str .= 'false'; //The booleans
      elseif($value === true) $str .= 'true';
      else $str .= '"' . addslashes($value) . '"'; //All other things
      // :TODO: Is there any more datatype we should be in the lookout for? (Object?)

      $parts[] = $str;
    }
  }
  $json = implode(',',$parts);

  if($is_list) return '[' . $json . ']';//Return numerical JSON
  return '{' . $json . '}';//Return associative JSON
}

Приготавливаемся принять в браузере

Для того что-бы IE понял правильно utf-8 кодировку, надо указать заголовки. Данные можно передавать как обычным текстом, так и заголовками (что-бы из браузера нельзя было напрямую это увидеть)

header('Content-Type: application/json; charset=utf-8');
header('X-JSON: '.$myJsonData);

В Javascript получаем текст и декодируем его в данные функцией eval. Также не забываем преобразовывать символы новой строки, если они встречаются в данных. Во многих javascript-библиотеках функции для работы с json, сериализацией форм и прочая уже есть.

//пример для prototype.js
json = eval(t.getResponseHeader('X-JSON'));

//Пример для jQuery
$.getJSON('/someJsonURL',function(json){
  json.descr=json.descr.replace(/n/g,"<br />");
  json.descr=json.descr.replace(/t/g,"t");
}



Рекомендуем почитать

 

Добавить комментарий


Ваше имя:


Комментарий:


Введите: Картинка