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

Владимир | | JavaScript, PHP.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Постовой

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

  • Scratch

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

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

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

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

  • Scratch

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

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

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

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

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

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

  • Scratch

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

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

  • Scratch

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

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

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

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

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

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

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

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

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

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

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

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

  • oblivion

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

    echo «updateName($name, $isLong)»;

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

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

    ?

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

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

      echo json_encode($res);

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

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

      Все заработало 🙂

  • oblivion

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

    echo «updateName($name, $isLong)»;

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

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

    ?

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

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

      echo json_encode($res);

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

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

      Все заработало 🙂

  • Pingback: CodeIgniter + AJAX. Проверка данных форм без перезагрузки страниц()

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

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

  • kirill

    Спасибо, для знакомства с JSON самое то!

  • kirill

    Спасибо, для знакомства с JSON самое то!

  • GG

    missing ] after element list
    [Break on this error] ([object Object])

    ошибка на 76
    $.ajax(
    69 {
    70 url: 'worker.php?mode=get_acc',
    71 dataType: 'json',
    72 success:
    73 function(data){
    74
    75
    76 var data = eval('(' + data +')');
    77
    ...........

    data = {"firm":"Audi","model":"A6","year":2008,"price":78000,"sellers":["u0424u0438u0440u043cu0430 u0410","u0424u0438u0440u043cu0430 u0411","u0424u0438u0440u043cu0430 u0412"]}
    Помогите разобраться.

    • В начале ответа, который отправляет сервер не должно быть data =

      Похоже именно это eval и не нравится.

  • GG

    missing ] after element list
    [Break on this error] ([object Object])

    ошибка на 76
    $.ajax(
    69 {
    70 url: 'worker.php?mode=get_acc',
    71 dataType: 'json',
    72 success:
    73 function(data){
    74
    75
    76 var data = eval('(' + data +')');
    77
    ...........

    data = {"firm":"Audi","model":"A6","year":2008,"price":78000,"sellers":["\u0424\u0438\u0440\u043c\u0430 \u0410","\u0424\u0438\u0440\u043c\u0430 \u0411","\u0424\u0438\u0440\u043c\u0430 \u0412"]}
    Помогите разобраться.

    • В начале ответа, который отправляет сервер не должно быть data =

      Похоже именно это eval и не нравится.

  • GG

    Мда ступил я
    dataType: 'json'
    зачем тогда eval('(' + data +')')
    Спасибо за статью.

    • подскажите, как мне вывести html код:

  • GG

    Мда ступил я
    dataType: 'json'
    зачем тогда eval('(' + data +')')
    Спасибо за статью.

    • подскажите, как мне вывести html код:

  • ====это файл в пхп, отправляет данные========
    $data = »
    Username:  
    Password:   

    «;
    echo json_encode($data);
    что-то делаю не так, но что я не знаю.. только только начал программить и впервые использую JSON, вот и проблемы..

  • ====это файл в пхп, отправляет данные========
    $data = »
    Username:  
    Password:   

    «;
    echo json_encode($data);
    что-то делаю не так, но что я не знаю.. только только начал программить и впервые использую JSON, вот и проблемы..

  • извиняюсь — я насорил — пытался отправить код РНР, видно он приимается сервером как код и не отображается…

    Итак, у меня есть форма хтмл. Она формируется РНР скриптом,я упаковываю ее командой json_encode($data);

    далее, как мне отобразить эту форму, подскажите плз

    • Преобразовать json в html можно с помощью JavaScript функции.
      Выглядеть она будет примерно так:

      //преобразуем json строку в объект JS
      var response = eval('(' + data +')');
      //формируем html код
      var formStr = '<form action="#" method="post">' + '<input type="text" name="username" value="' + data.Username + '" />' + …
      //и т.д. (это примерный вариант кода)

      //вставляем форму в страницу, тут все зависит от разметки
      //страницы, если используется jQuery удобно использовать
      //функции appendTo, insertAfter и т.п.

      Посмотрите ещё эту статью.

      • Светлана

        Владимир, я не программист, я всего-лишь пользователь. ПОМОГИТЕ!!! Моя закладки в Mozilla сохранились в Json, а чтобы их загрузить обратно, нужен формат html. Я НИЧЕГО не понимаю в этих записях:

        //преобразуем json строку в объект JS
        var response = eval('(' + data +')');
        //формируем html код
        var formStr = » + » + …
        //и т.д. (это примерный вариант кода)

        //вставляем форму в страницу, тут все зависит от разметки
        //страницы, если используется jQuery удобно использовать
        //функции appendTo, insertAfter и т.п.

        КУДА это писать? я даже не представляю. я не программист. Помогите мне пожалуйста вернуть мои закладки!
        моё мыло maboroshi@list.ru, прошу вас, ответьте!!!

        • Вам не нужно преобразовывать json файл в html, вы можете восстановить закладки прямо из него.
          Инструменты -> Управление закладками… -> Импорт и резервирование -> Восстановить -> Выбрать файл. И указываете json файл.

        • Светлана

          О, благослови Вас Аллах!))))) Спасибо!

  • извиняюсь — я насорил — пытался отправить код РНР, видно он приимается сервером как код и не отображается…

    Итак, у меня есть форма хтмл. Она формируется РНР скриптом,я упаковываю ее командой json_encode($data);

    далее, как мне отобразить эту форму, подскажите плз

    • Преобразовать json в html можно с помощью JavaScript функции.
      Выглядеть она будет примерно так:

      //преобразуем json строку в объект JS
      var response = eval('(' + data +')');
      //формируем html код
      var formStr = '<form action="#" method="post">' + '<input type="text" name="username" value="' + data.Username + '" />' + ...
      //и т.д. (это примерный вариант кода)

      //вставляем форму в страницу, тут все зависит от разметки
      //страницы, если используется jQuery удобно использовать
      //функции appendTo, insertAfter и т.п.

      Посмотрите ещё эту статью.

      • Светлана

        Владимир, я не программист, я всего-лишь пользователь. ПОМОГИТЕ!!! Моя закладки в Mozilla сохранились в Json, а чтобы их загрузить обратно, нужен формат html. Я НИЧЕГО не понимаю в этих записях:

        //преобразуем json строку в объект JS
        var response = eval('(' + data +')');
        //формируем html код
        var formStr = » + » + …
        //и т.д. (это примерный вариант кода)

        //вставляем форму в страницу, тут все зависит от разметки
        //страницы, если используется jQuery удобно использовать
        //функции appendTo, insertAfter и т.п.

        КУДА это писать? я даже не представляю. я не программист. Помогите мне пожалуйста вернуть мои закладки!
        моё мыло maboroshi@list.ru, прошу вас, ответьте!!!

        • Вам не нужно преобразовывать json файл в html, вы можете восстановить закладки прямо из него.
          Инструменты -> Управление закладками… -> Импорт и резервирование -> Восстановить -> Выбрать файл. И указываете json файл.

        • Светлана

          О, благослови Вас Аллах!))))) Спасибо!

  • спасибо, та статья не очень помогла, с передачей данных серверу это не проблема, у меня проблема выходит при интерпретации полученных данных от сервера.

    расскажите как обраться к элементу, и онечно же, как же этот элемент вывести на экран с оформлением, указанным в массиве.. вот например, есть многомерный ассоц массив:
    массив[«теги»]=»теги формы, теги оформления, и прочая дребедень..»;
    массив[«Пользователь»] = «пользователь»;
    массив[«Имя»] = «Имя»;
    массив[«Фамилия»]=»фамилия»;
    массив[«теги_закр»]=»закр теги»;

    Ассоц масссив это я для примера, чтоб лучше понять как работать с этим всем добром…
    Помогите это вывести теперь на экран после того, как оно будет преобразовано в JSON.

    У меня еще проблемы с ява скрипт — я только только начал изучать и у меня осталось всего 20 часов, чтоб сделать задание по AJAX.. c РНР проблем нет, но вот с этим добром…

  • спасибо, та статья не очень помогла, с передачей данных серверу это не проблема, у меня проблема выходит при интерпретации полученных данных от сервера.

    расскажите как обраться к элементу, и онечно же, как же этот элемент вывести на экран с оформлением, указанным в массиве.. вот например, есть многомерный ассоц массив:
    массив[«теги»]=»теги формы, теги оформления, и прочая дребедень..»;
    массив[«Пользователь»] = «пользователь»;
    массив[«Имя»] = «Имя»;
    массив[«Фамилия»]=»фамилия»;
    массив[«теги_закр»]=»закр теги»;

    Ассоц масссив это я для примера, чтоб лучше понять как работать с этим всем добром…
    Помогите это вывести теперь на экран после того, как оно будет преобразовано в JSON.

    У меня еще проблемы с ява скрипт — я только только начал изучать и у меня осталось всего 20 часов, чтоб сделать задание по AJAX.. c РНР проблем нет, но вот с этим добром…

  • емае! люди, спасибо за помощь, я все делал правильно… все отлично работает…Владимир, спасибо за отклик

    Проблема: файл для отображения формы и всей прочей дребедени был xhtml, он тупо не понимал несколько тегов и не ругался, ничего не говорил, тупо ничего не показывал…

    P.S а ресурс классный у вас все таки=), буду заглядывать

  • емае! люди, спасибо за помощь, я все делал правильно… все отлично работает…Владимир, спасибо за отклик

    Проблема: файл для отображения формы и всей прочей дребедени был xhtml, он тупо не понимал несколько тегов и не ругался, ничего не говорил, тупо ничего не показывал…

    P.S а ресурс классный у вас все таки=), буду заглядывать

  • POM

    Hi! Помогите, плиз!

    Уже 8-ой день мучаюсь, не могу понять в чем проблема:

    есть два select, где при выборе в первом происходит построение второго из php,

    на локальном сервере все работает, а на «реальном» нет.
    как я понял дело в eval, хотя может и не так…

    перерыл уже столько сайтов и никакого результата, просто уже устал. перепробовал уже все варианты со скобками о которых часто пишут, якобы в них причина… но бесполезно… уже не знаю что думать 🙁

    • Попробуйте с помощью eval выполнить какой-нибудь простой код, вроде echo '111' , и постепенно добавляйте функционал, пока скрипт не перестанет работать.
      Я понимаю, что занятие не самое веселое, но, по крайней мере, узнаете когда возникает сбой.

      Еще вариант — сравнить конфиги php обоих серверов.

  • POM

    Hi! Помогите, плиз!

    Уже 8-ой день мучаюсь, не могу понять в чем проблема:

    есть два select, где при выборе в первом происходит построение второго из php,

    на локальном сервере все работает, а на «реальном» нет.
    как я понял дело в eval, хотя может и не так…

    перерыл уже столько сайтов и никакого результата, просто уже устал. перепробовал уже все варианты со скобками о которых часто пишут, якобы в них причина… но бесполезно… уже не знаю что думать 🙁

    • Попробуйте с помощью eval выполнить какой-нибудь простой код, вроде echo '111' , и постепенно добавляйте функционал, пока скрипт не перестанет работать.
      Я понимаю, что занятие не самое веселое, но, по крайней мере, узнаете когда возникает сбой.

      Еще вариант — сравнить конфиги php обоих серверов.

  • POM

    Спасибо, наконец то получилось сделать…

    просто я только новенький в программировании и до этого момента делал на php и с javascript почти не сталкивался, взял модуль готовый на яваскрипт и подогнал под себя, на виртуальном сервере работало, а как залил на хостинг, то перестало… мучился-мучился, в итоге взялся за явускрипт, разобрался в синтаксисе языка, как что работает, вообщем «че по чем хоккей с мячом»… и это оказалось гораздо лучше и легче.

    сделал не через eval, написал все в одном скрипте без php, получилось по строкам легче в два-три раза 🙂

    спасибо за отклик! теперь думаю покончено с готовыми решениями… лучше писать самому, легче в отладке и редактировании и ни чего лишнего!

  • POM

    Спасибо, наконец то получилось сделать…

    просто я только новенький в программировании и до этого момента делал на php и с javascript почти не сталкивался, взял модуль готовый на яваскрипт и подогнал под себя, на виртуальном сервере работало, а как залил на хостинг, то перестало… мучился-мучился, в итоге взялся за явускрипт, разобрался в синтаксисе языка, как что работает, вообщем «че по чем хоккей с мячом»… и это оказалось гораздо лучше и легче.

    сделал не через eval, написал все в одном скрипте без php, получилось по строкам легче в два-три раза 🙂

    спасибо за отклик! теперь думаю покончено с готовыми решениями… лучше писать самому, легче в отладке и редактировании и ни чего лишнего!

  • Михаил

    Тестирую json на локальном Apache. Через XMLHttpRequest запрашваю файл php, ответ беру из responseText и разбираю eval'ом. Проблема: меняю текст запрашиваемого php, а получаемая от него через запрос информация не меняется. Перезагружаю браузер (не страницу) — меняется. Вроде, если подождать часика 2, то тоже помогает (но провёл только 1 эксперимент такого рода).

    • Судя по симптомам — ответ сервера остаётся в кеше браузера.
      Попробуйте добавить в начало вашего скрипта заголовки
      Header('Cache-Control: no-cache');
      Header('Pragma: no-cache');

      • Михаил

        Большое спасибо!

  • Михаил

    Тестирую json на локальном Apache. Через XMLHttpRequest запрашваю файл php, ответ беру из responseText и разбираю eval'ом. Проблема: меняю текст запрашиваемого php, а получаемая от него через запрос информация не меняется. Перезагружаю браузер (не страницу) — меняется. Вроде, если подождать часика 2, то тоже помогает (но провёл только 1 эксперимент такого рода).

    • Судя по симптомам — ответ сервера остаётся в кеше браузера.
      Попробуйте добавить в начало вашего скрипта заголовки
      Header('Cache-Control: no-cache');
      Header('Pragma: no-cache');

      • Михаил

        Большое спасибо!

  • Спасибо за то, что ткнули носом в функции! Очень помогло, хотел уж regexp'ами делать 🙂

  • Регулярные выражения — на крайний случай. Практически для всех распространенных форматов есть специальные библиотеки.

  • Именно в поисках такой библиотеки я набрел на Ваш сайт.

  • X_vans_x

    Да напишите вы свой парсер массива) Который переводит массив в JSON ) могу поделится

    function vansJSON($array){
    $jSON=»{«;
    $i=0;
    $count=count($array);
    foreach($array as $key=>$val){
    $jSON.=$key.»:»;
    if(is_array($val)){
    $jSON.=vansJSON($val);
    }else{
    $jSON.=»'».$val.»'»;
    }
    if($i<($count-1)){
    $jSON.=»,»;
    }

    $i++;

    }
    $jSON.=»}»;
    return $jSON;
    }

  • Yandex

    Json быстрый и экономичный формат.

  • Игорь Хроменков

    Очень хорошая статья, спасибо)

  • Таня Андреева

    ребят я полная дура у меня приходит результат обработанного json вопрос стоит либо как это г сохранить в файло типа pdf с последующим открытием его в шаблоне сайта либо как изначально открыть в шаблоне я либо в ткст ыижу текст json не распарсеный либо нифига не вижу. меню уволят и еще я не могу задать корректную страницу вылезает вот такое г
    http://mfc:81/status.php?deal_number=13777&deal_pin=5419&Submit=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5

    • 1) Вы получаете JSON и преобразовываете в массив с помощью json_decode
      2) Данные из массива можно использовать для формирования pdf или шаблона сайта.
      3) Приведите фрагмент кода шаблона, я посмотрю что не так (только желательно код выложить на каком-нибудь сервисе вроде http://pastebin.com/, а не вставлять в комментарий).

      4) Для работы с pdf файлами можно использовать какую-нибудь библиотеку вроде https://github.com/KnpLabs/snappy или https://github.com/wkhtmltopdf/wkhtmltopdf

  • Илья

    Спасибо!!!