Как из PHP скрипта передать данные в формате JSON
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 позволят легко найти ваш автомобиль
Понравилась статья? Подписывайтесь на продолжение
!
Опубликовано в JavaScript, PHP Комментарии (24) »
Комментарии (24)
Вы можете отслеживать обсуждение записи с помощью RSS 2.0 ![]()
Вы также можете оставить комментарий, или трекбек с Вашего сайта.









Хы. Вот вам код, запишите:
$a = array(&$a);
Сделаем ему serialize($a), получим красивую строку ("a:1:{i:0;a:1:{i:0;R:2;}}", вот так).
А теперь — то же самое в JSON.
Действительно смешно
).
Я как-то случайно попытался преобразовать в JSON массив со ссылкой на самого себя. Получил сообщение об ошибке (не понравилась рекурсия
Вообще-то, я зря использовал слово "любой".
Ну, я использовал PHP4 для работы с JSON, и конкретно — PEAR библиотеку…
Получил "вложенность вызовов функции больше 100"
Лучше всего – отвечать с сервера json_encode функцией и не использовать evalы
Не использовать eval-ы где?
В случае с JS это практически единственный верный способ.
Правда, перед этим json проверяется на наличие всяческих вредоносных строк (это на всякий случай), ну и помимо прочего JS в обычном состоянии не может загрузить данные с внешнего сайта..
Так что не понимаю, при чем тут eval?
Даже проверку перед eval'ом на стороне клиента не стоит делать. Я не могу представить случай, когда это могло бы повредить безопасности
Что-то я не понял. В примере сервер и отвечает json_encode функцией (предпоследний листинг), она преобразует массив в формат JSON.
А на стороне браузера нужно выполнить обратную операцию, чтобы преобразовать строку JSON в объект JavaScript, для этого и используется eval.
а как мне передать в eval() через php функцию js?

так не работает:
$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.
Все заработало
Отличная статья для знакомства с JSON. Спасибо
Спасибо, для знакомства с JSON самое то!
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 и не нравится.
Мда ступил я
dataType: 'json'
зачем тогда eval('(' + data +')')
Спасибо за статью.
подскажите, как мне вывести html код:
====это файл в пхп, отправляет данные========
$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 и т.п.
Посмотрите ещё эту статью.
спасибо, та статья не очень помогла, с передачей данных серверу это не проблема, у меня проблема выходит при интерпретации полученных данных от сервера.
расскажите как обраться к элементу, и онечно же, как же этот элемент вывести на экран с оформлением, указанным в массиве.. вот например, есть многомерный ассоц массив:
массив["теги"]="теги формы, теги оформления, и прочая дребедень..";
массив["Пользователь"] = "пользователь";
массив["Имя"] = "Имя";
массив["Фамилия"]="фамилия";
массив["теги_закр"]="закр теги";
Ассоц масссив это я для примера, чтоб лучше понять как работать с этим всем добром…
Помогите это вывести теперь на экран после того, как оно будет преобразовано в JSON.
У меня еще проблемы с ява скрипт – я только только начал изучать и у меня осталось всего 20 часов, чтоб сделать задание по AJAX.. c РНР проблем нет, но вот с этим добром…
емае! люди, спасибо за помощь, я все делал правильно… все отлично работает…Владимир, спасибо за отклик
Проблема: файл для отображения формы и всей прочей дребедени был xhtml, он тупо не понимал несколько тегов и не ругался, ничего не говорил, тупо ничего не показывал…
P.S а ресурс классный у вас все таки=), буду заглядывать
Hi! Помогите, плиз!
Уже 8-ой день мучаюсь, не могу понять в чем проблема:
есть два select, где при выборе в первом происходит построение второго из php,
на локальном сервере все работает, а на "реальном" нет.
как я понял дело в eval, хотя может и не так…
перерыл уже столько сайтов и никакого результата, просто уже устал. перепробовал уже все варианты со скобками о которых часто пишут, якобы в них причина… но бесполезно… уже не знаю что думать
Попробуйте с помощью eval выполнить какой-нибудь простой код, вроде echo '111' , и постепенно добавляйте функционал, пока скрипт не перестанет работать.
Я понимаю, что занятие не самое веселое, но, по крайней мере, узнаете когда возникает сбой.
Еще вариант – сравнить конфиги php обоих серверов.
Спасибо, наконец то получилось сделать…
просто я только новенький в программировании и до этого момента делал на php и с javascript почти не сталкивался, взял модуль готовый на яваскрипт и подогнал под себя, на виртуальном сервере работало, а как залил на хостинг, то перестало… мучился-мучился, в итоге взялся за явускрипт, разобрался в синтаксисе языка, как что работает, вообщем "че по чем хоккей с мячом"… и это оказалось гораздо лучше и легче.
сделал не через eval, написал все в одном скрипте без php, получилось по строкам легче в два-три раза
спасибо за отклик! теперь думаю покончено с готовыми решениями… лучше писать самому, легче в отладке и редактировании и ни чего лишнего!