Как из PHP скрипта передать данные в формате JSON

7 октября, 2007

JSON (Java Script Object Notation) – это относительно новый формат представления данных. Он позволяет записать в виде строки любой набор переменных (массивов, объектов), что делает его использование очень удобным в Ajax приложениях.

Рассмотрим обычную ситуацию. У нас есть html страница с формой и php скрипт, который обрабатывает данные, введённые в эту форму. Если запрос с данными формы отправляется обычным способом, то скрипт должен возвратить html страницу с результатами. Тут все однозначно. Но, если данные формы отправляются ajax запросом, то скрипт возвращает только результаты обработки, которые с помощью JavaScript вставляются в исходную страницу. Вот тут и возникает вопрос. В каком виде передавать результат?

Существуют два основных варианта. Первый – возвратить результаты обработки вместе с html разметкой. В этом случае, полученный результат просто вставляется в страницу без обработки. Но тут возникает несколько проблем. Во-первых, если вы захотите изменить дизайн страницы, то потребуется менять код в php скрипте. Во-вторых, если результат обработки должен быть вставлен в несколько различных фрагментов страницы, то придётся либо с помощью JavaScript разбирать полученный от сервера результат, либо передавать ещё и все промежуточные фрагменты.

Второй вариант предполагает возврат только результатов обработки (без html разметки). Получив данные, JavaScript функция вставляет их в соответствующие части страницы.

На сегодняшний день наиболее распространены два формата передачи результатов ajax запроса: XML и JSON.

С моей точки зрения, использование JSON удобнее, главным образом за счёт встроенных в JavaScript и PHP функций, упрощающих работу с этим форматом.

Прежде всего, посмотрим, как записываются данные в формате JSON. Допустим, у нас есть объект класса Table.

  1. class Table {
  2. public $material = "дерево";
  3. public $weight = 20.5;
  4. public $isAvailable = true;
  5. public $colors = array("черный", "коричневый", "серый");
  6. public $dimensions = array("length"=>2.0, "width"=>1.2, "height"=>0.75);
  7. }

В формате JSON этот объект будет записан следующим образом:

  1. {
  2. "material":"дерево",
  3. "weight":20.5,
  4. "isAvailable":true,
  5. "colors":["черный","коричневый","серый"],
  6. "dimensions":{"length":2,"width":1.2,"height":0.75}
  7. }

Как видите, все довольно просто. Для каждого объекта в фигурных скобках через запятую приводятся все его параметры. Каждый параметр записывается в виде пары ключ:значение. Если параметр является массивом, то его значения записываются в квадратных скобках. Кроме того, можно неограниченно вкладывать объекты и массивы друг в друга. Таким образом, в формате JSON можно представить практически любой набор данных.
Примечание: подробнее почитать об этом формате можно здесь.

Теперь разберём, как преобразовывать данные из объектов в JSON и обратно.

PHP
Преобразование данных в JSON выполняется с помощью функции json_encode(). Для обратного преобразования используется json_decode().
Например, результатом выполнения следующего кода

  1. $test = array("111","222","333");
  2. echo json_encode($test);

будет строка:
["111","222","333"]

JavaScript
Функция eval() преобразует строку в формате JSON в объекты JavaScript.
Записать JavaScript объекты в формате JSON можно с помощью метода toJSONString().
Рассмотрим небольшой пример. Допустим, строка, полученная в ответ на ajax запрос, находится в переменной response. В эту строку записан объект класса Table (который мы рассматривали в начале статьи). Преобразуем эту строку в объект JavaScript.

  1. var data = eval("(" + response + ")");
  2. //теперь можно использовать объект data
  3. alert(data.material + "n" + data.weight + "n" + data.isAvailable +
  4.     "n" + data.colors + "n" + data.dimensions.length + "; " +
  5.     data.dimensions.width + "; " + data.dimensions.height);

Как видите, функции, входящие в состав PHP и JS обеспечивают достаточно комфортную и простую работу с JSON.
Преобразования сводятся к вызову одной функции. Это довольно ощутимое преимущество по сравнению с XML. Ведь в случае XML придётся просматривать все DOM дерево.

В следующей статье мы рассмотрим, как изменится обычное web приложение при использовании JSON.

Постовой

Системы gps позволят легко найти ваш автомобиль

Понравилась статья? Подпишитесь на продолжение rss link !

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в JavaScript, PHP

]]>

Комментарии (11)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. Scratch 29.10.2007 в 21:36 (Ответить)

    Он позволяет записать в виде строки любой набор переменных (массивов, объектов),

    Хы. Вот вам код, запишите:
    $a = array(&$a);

    Сделаем ему serialize($a), получим красивую строку ("a:1:{i:0;a:1:{i:0;R:2;}}", вот так).

    А теперь — то же самое в JSON. :)

  2. Владимир 29.10.2007 в 23:02 (Ответить)

    Действительно смешно :-)
    Я как-то случайно попытался преобразовать в JSON массив со ссылкой на самого себя. Получил сообщение об ошибке (не понравилась рекурсия :-) ).
    Вообще-то, я зря использовал слово "любой".

  3. Scratch 30.10.2007 в 14:03 (Ответить)

    Ну, я использовал PHP4 для работы с JSON, и конкретно — PEAR библиотеку…

    Получил "вложенность вызовов функции больше 100"

  4. Snowcore 19.05.2008 в 16:04 (Ответить)

    Лучше всего - отвечать с сервера json_encode функцией и не использовать evalы

    1. Scratch 20.05.2008 в 02:58 (Ответить)

      Не использовать eval-ы где?
      В случае с JS это практически единственный верный способ.
      Правда, перед этим json проверяется на наличие всяческих вредоносных строк (это на всякий случай), ну и помимо прочего JS в обычном состоянии не может загрузить данные с внешнего сайта..

      Так что не понимаю, при чем тут eval?

      1. Даже проверку перед eval'ом на стороне клиента не стоит делать. Я не могу представить случай, когда это могло бы повредить безопасности

    2. Владимир 21.05.2008 в 11:48 (Ответить)

      Что-то я не понял. В примере сервер и отвечает json_encode функцией (предпоследний листинг), она преобразует массив в формат JSON.
      А на стороне браузера нужно выполнить обратную операцию, чтобы преобразовать строку JSON в объект JavaScript, для этого и используется eval.

  5. oblivion 15.07.2008 в 23:49 (Ответить)

    а как мне передать в eval() через php функцию js?
    так не работает:
    8)
    $isLong = TRUE;
    else
    $isLong = FALSE;

    echo "updateName($name, $isLong)";

    ?>
    updateName - js функция, её встречает у клиента:

    onComplete:function(xhr){
    eval(xhr.responseText);
    }

    ?

    1. Владимир 28.07.2008 в 17:38 (Ответить)

      Я сделал так.
      В серверном скрипте сформировал и отправил массив со всеми данными (в формате json)

      $res['myscript'] = 'alert("111");';

      echo json_encode($res);

      На стороне браузера:
      var response = eval('(' + transport.responseText + ')');
      eval(response.myscript);

      Т.е. сначала преобразовал в JavaScript-объект, а затем передал поле response.myscript в качестве параметра eval.

      Все заработало :-)

  6. [...] Примечание. Подробнее почитать об этом формате можно в статье «Передача данных с помощью JSON». [...]

  7. maximus 23.09.2008 в 14:24 (Ответить)

    Отличная статья для знакомства с JSON. Спасибо

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags:

]]>