<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery и другое... &#187; json</title>
	<atom:link href="http://www.linkexchanger.su/category/json/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Tue, 25 May 2010 08:13:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Каскад раскрывающихся списков</title>
		<link>http://www.linkexchanger.su/2009/82.html</link>
		<comments>http://www.linkexchanger.su/2009/82.html#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:00:42 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/82.html</guid>
		<description><![CDATA[При создании приложений для Web часто бывает необходимо установить в элементе select варианты выбора, значения которых зависят от параметров другого элемента select. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого [...]]]></description>
			<content:encoded><![CDATA[<p>При создании приложений для Web часто бывает необходимо установить в элементе <strong>select</strong> варианты выбора, значения которых зависят от параметров другого элемента <strong>select</strong>. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого авто. Вот и давайте попробуем вместе решить эту задачу, создав <strong>каскад раскрывающихся списков</strong>.<span id="more-82"></span></p>
<p>Для начала определим задачу: первый список будет содержать предварительно загруженные названия стран и всегда находиться в активном состоянии. Два оставшихся списка &#8211; выбора авто и выбора модели, пустые и находятся в неактивном состоянии. После того, как в первом списке будет выбрана страна необходимо заполнить второй список названиями автомобилей и перевести его в активное состояние. А после выбора названия автомобиля &#8211; заполнить список названиями моделей именно этого автомобиля и тоже активировать список. Кроме того, мы должны гарантировать, что пользователь никогда не сможет выбрать автомобиль &laquo;HONDA Vectra произведеный в Ю.Корее&raquo;. Для обмена данными с сервером будем использовать популярный нынче формат JSON.</p>
<p>Итак, задача определена. Поехали?</p>
<p>Начнем с чего-нибудь очень простого. Например с подключения библиотеки jQuery и создания HTML-разметки:</p>
<p>В HEAD страницы подключаем библиотеку:</p>
<pre class="brush: xml;">&lt;script src=&quot;js/jquery-1.3.1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>В BODY создаем HTML-разметку:</p>
<pre class="brush: xml;">
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Страна&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;country&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Выбрать страну&lt;/option&gt;
    &lt;option value=&quot;1&quot;&gt;Германия&lt;/option&gt;
    &lt;option value=&quot;2&quot;&gt;Ю.Корея&lt;/option&gt;
    &lt;option value=&quot;3&quot;&gt;Япония&lt;/option&gt;
  &lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Автомобиль&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;auto&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Модель&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;model&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
</pre>
<p>Легко и просто! Каждому списку &#8211; по id. Первый раскрывающийся список заполняем названиями стран. Два других ничем не заполняем и мало того, устанавливаем в неактивное состояние с помощью атрибута disabled. Описания стилей я приводить не буду &#8211; это дело вкуса каждого и не в тему этой статьи.</p>
<p>Что дальше? Задача оказалась не так уж и проста, как казалось в начале. Поэтому предлагаю пораскинуть мозгами и решить, какие  общие действия мы будем производить над всеми списками. Я придумал два &#8211; заполнение списка и очистка списка. Давайте оформим  эти операции в виде методов jQuery, чтобы иметь возможность в любой момент вызвать этот метод в цепочке команд jQuery.</p>
<blockquote><p>Расширение для jQUery может быть либо методом, оперирующим с набором элементов, либо вспомогательной функцией, которая определяется непосредственно в $. Простой пример: в составе библиотеки есть метод <strong>each(callback)</strong>, который работает как раз с набором элементов, выполняя функцию, определенную в параметре callback в контексте каждого элемента набора и вспомогательная функция <strong>$.each(object,callback)</strong>, которая применяется для обхода массива или объекта, переданного в первом параметре с выполнением функции callback для каждого элемента массива(объекта). Почувствовали разницу?</p></blockquote>
<pre class="brush: jscript;">(function($){
  // очищаем select
  $.fn.clearSelect = function() {
    return this.each(function(){
      if(this.tagName=='SELECT') {
        this.options.length = 0;
        $(this).attr('disabled','disabled');
      }
    });
  }
  // заполняем select
  $.fn.fillSelect = function(dataArray) {
    return this.clearSelect().each(function(){
      if(this.tagName=='SELECT') {
        var currentSelect = this;
        $.each(dataArray,function(index,data){
          var option = new Option(data.text,data.value);
          if($.support.cssFloat) {
            currentSelect.add(option,null);
          } else {
            currentSelect.add(option);
          }
        });
      }
    });
  }
})(jQuery);</pre>
<p>Итак, что мы тут написали?</p>
<p>При написании метода <strong>clearSelect()</strong> мы воспользовались методом <strong>each(callback)</strong> для того, чтобы произвести необходимые операции над каждым элементом, переданным в наборе jQuery. Сначала производим проверку &#8211; если <strong>tagName</strong> переданного элемента действительно SELECT, то удаляем все элементы option и устанавливаем атрибуту disabled значение disabled.</p>
<p>Метод <strong>fillSelect(dataArray)</strong> несколько сложнее. Он получает в качестве параметра массив dataArray, содержащий данные, которыми необходимо заполнить выпадающий список. Правда перед тем, как заполнять список, мы вызовем метод <strong>clearSelect</strong>, чтобы очистить список от возможно оставшихся там данных. С помощью метода <strong>each(callback)</strong> мы перебираем все элементы, переданные в наборе jQuery, проверяем, действительно ли это элемент select и, если да, то сначала запоминаем его в переменной currentSelect. Затем воспользуемся вспомогательной функцией <strong>$.each(object,callback)</strong> для обхода массива dataArray. В каждой итерации создаем элемент options, заполняем его соответствующими данными и добавляем в select.</p>
<p>При добавлении option мы вынуждены учитывать различия между браузерами. К счастью и тут поможет jQuery. Здесь используем новую вспомогательную функцию <strong>$.support</strong>, которая появилась в jQuery с версии 1.3 взамен <strong>$.browser</strong>. Проверим значение свойства <strong>cssFloat</strong> &#8211; false укажет нам на IE, а true на FF, Opera, Safari. Вы можете применить свой способ проверки.</p>
<blockquote><p>Обратите внимание: при написании метода <strong>fillSelect(dataArray)</strong> мы использовали метод <strong><a href="http://docs.jquery.com/Core/each#callback">each(callback)</a></strong> и вспомогательную функцию <strong><a href="http://docs.jquery.com/Utilities/jQuery.each#objectcallback">$.each(object,callback)</a></strong> &#8211; это разные вещи.</p></blockquote>
<p>Теперь оба наших новых метода могут работать с набором элементов jQuery, который им будет передан. Этот код можно было бы вынести в отдельный файл &#8211; к тому же эти методы могут пригодиться и в других приложениях, а использовать их можно проще простого:</p>
<pre class="brush: jscript;">
// очищаем select
$('select').clearSelect();
// заполняем select
$('select').fillSelect(dataArray);</pre>
<p>Двигаемся дальше. Теперь мы напишем пару функций, которые будут обслуживать списки выбора автомобиля и выбора модели.</p>
<pre class="brush: jscript;">
// выбор автомобиля
function adjustAuto(){
  var countryValue = $('#country').val();
  var tmpSelect = $('#auto');
  if(countryValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
    adjustModel();
  } else {
    $.getJSON(
      'cascadeSelectAuto.php',
      {country:countryValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
        adjustModel();
    });
  }
};</pre>
<p>Здесь мы сначала запоминаем в переменной <strong>countryValue</strong> значение, выбранное в списке стран <strong>#country</strong>. В переменной <strong>tmpSelect</strong> будем хранить ссылку на элемент select с идентификатором <strong>#auto</strong> &#8211; список выбора автомобиля. Далее следует проверка:</p>
<p>Если страна не выбрана, то мы устанавливаем атрибуту disabled элемента select с идентификатором <strong>#auto</strong> значение &#8216;disabled&#8217; и вызываем метод <strong>clearSelect()</strong> для очистки этого списка от возможно находящихся там значений. Также мы вызовем функцию <strong>adjustModel()</strong> (про нее чуть позже).</p>
<p>Иначе, мы отправляем с помощью вспомогательной функции <strong>$.getJSON</strong> запрос к файлу <strong>cascadeSelectAuto.php</strong>, передавая в качестве данных значение, сохраненное в переменной <strong>countryValue</strong>. При получении ответа сервера вызываем функцию, в которой определена нужная нам последовательность действий. А именно &#8211; к переменной <strong>tmpSelect</strong> (не забыли &#8211; это список с идентификатором <strong>#auto</strong>) применяем нами же написанный метод <strong>fillSelect(data)</strong>, который заполнит список данными, которые получены от сервера и наконец переводим элемент в активное состояние с помощью атрибута disabled. Остается не забыть вызвать функцию <strong>adjustModel()</strong>, чтобы обработать выпадающий список моделей.</p>
<p>Функция <strong>adjustModel()</strong>, которая обрабатывает список моделей, очень похожа на <strong>adjustAuto()</strong>, поэтому нет смысла ее детально рассматривать. Обратите внимание разве на то, что теперь мы запоминаем значение из списка не только выбранной страны, но и выбранного автомобиля. И еще в <strong>if &#8211; else</strong> не вызываем что-то похожее на <strong>adjustModel()</strong>, поскольку список выбора модели у нас последний &#8211; дальше обрабатывать просто нечего.</p>
<pre class="brush: jscript;">
// выбор модели
function adjustModel(){
  var countryValue = $('#country').val();
  var autoValue = $('#auto').val();
  var tmpSelect = $('#model');
  if(countryValue.length == 0||autoValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
  } else {
    $.getJSON(
      'cascadeSelectModel.php',
      {country:countryValue,auto:autoValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
    });
  }
};</pre>
<p>Поздравляю! Самая сложная часть пути уже позади! Остались сущие пустяки.</p>
<pre class="brush: jscript;">$('#country').change(function(){
  adjustAuto();
}).change();</pre>
<p>Связываем с выпадающим списком стран событие <strong>change(fn)</strong>, при наступлении которого вызываем <strong>adjustAuto()</strong> &#8211; функцию, которая заполнит выпадающий список автомобилей. В цепочке команд вызываем <strong>change()</strong>, чтобы вызвать событие при начальной загрузке страницы.</p>
<pre class="brush: jscript;">$('#auto').change(adjustModel);</pre>
<p>С выпадающим списком автомобилей связываем событие <strong>change(fn)</strong>, при наступлении которого будет выполнена функция <strong>adjustModel()</strong>, которая заполнит список моделей.</p>
<pre class="brush: jscript;">$('#model').change(function(){
  if($(this).val().length != 0) {
    alert('Выбор сделан!');
  }
});</pre>
<p>И наконец, при изменении списка моделей выполним небольшую проверку &#8211; если действительно выбрана какая-либо модель, выведем в <strong>alert</strong> сообщение. Ну а в действительности тут можно придумать все, что угодно. Например вывести подробную информацию о технических характеристиках, красивую фотографию авто, чтобы его захотелось купить и конечно цену&#8230;</p>
<p>Ах, да! Совсем забыл &#8211; работающий пример:<br />
<iframe src="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" style="border: medium none " width="420" height="100"></iframe></p>
<blockquote><p>Вы можете открыть <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" target="_blank">пример</a></strong> в новом окне, чтобы посмотреть исходный код. Вы можете <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.zip">скачать</a></strong> архив, который содержит файлы примера (в том числе cascadeSelectAuto.php и cascadeSelectModel.php).</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/82.html/feed</wfw:commentRss>
		<slash:comments>104</slash:comments>
		</item>
		<item>
		<title>Как работать с JSON?</title>
		<link>http://www.linkexchanger.su/2008/41.html</link>
		<comments>http://www.linkexchanger.su/2008/41.html#comments</comments>
		<pubDate>Mon, 03 Mar 2008 05:50:06 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/41.html</guid>
		<description><![CDATA[Вероятно Вы уже прочитали статью &#171;Что такое JSON?&#171;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат JSON и обратных преобразованиях строки ответа от сервера в формате JSON в объект JavaScript, а также рассмотрим средства для работы с [...]]]></description>
			<content:encoded><![CDATA[<p>Вероятно Вы уже прочитали статью &laquo;<a href="http://www.linkexchanger.su/2008/40.html">Что такое JSON?</a>&laquo;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат <strong>JSON</strong> и обратных преобразованиях строки ответа от сервера в формате <strong>JSON</strong> в объект JavaScript, а также рассмотрим средства для работы с <strong>JSON</strong> на стороне сервера.<span id="more-41"></span></p>
<p>Дуглас Крокфорд (Douglas Crockford), который собственно и предложил <strong>формат JSON</strong> в качестве альтернативы XML при передаче данных от сервера клиенту, в рамках этого проекта разработал специальную утилиту, предназначенную для упомянутых выше преобразований. Исходник можно найти по адресу <a href="http://www.json.org/js.html" target="_blank">http://www.json.org/js.html.</a></p>
<p>В предыдущей статье о <strong>JSON</strong> мы уже немного коснулись преобразования строки данных в объект JavaScript с помощью функции <strong>eval()</strong>, но все-таки нельзя забывать о том, что функция эта не только поможет интерпретировать данные в формат JSON, но и выполнит любой JavaScript-код, который будет ей передан. Так как это обстоятельство может представлять собой потенциальную угрозу, логичнее воспользоваться утилитой Дугласа Крокфорда.</p>
<p>Но давайте обо всем по порядку. Для начала подключим утилиту к нужному файлу:</p>
<pre class="brush: jscript;">&lt;script src=&quot;json.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Создадим объект <strong>oAuto</strong> обычным способом, забыв о литеральной нотации.</p>
<pre class="brush: jscript;">var oAuto = new Object();
oAuto.firm = &quot;Audi&quot;;
oAuto.model = &quot;A6&quot;;
oAuto.year = 2008;
oAuto.price = 78000;
oAuto.sellers = new Array(
  &quot;Фирма А&quot;,
  &quot;Фирма Б&quot;,
  &quot;Фирма В&quot;
);</pre>
<p>Передадим объект методу <strong>JSON.stringify()</strong></p>
<pre class="brush: jscript;">document.write(JSON.stringify(oAuto));</pre>
<p>и в результате работы этого небольшого кусочка кода будет выведена <strong>строка в формате JSON</strong>, которую можно передавать по любому адресу.</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,
&quot;price&quot;:78000,&quot;sellers&quot;:[&quot;Фирма А&quot;,&quot;Фирма Б&quot;,&quot;Фирма В&quot;]}</pre>
<p>Предположим теперь, что эту самую строку мы получили в качестве ответа от сервера и ее надо преобразовать в объект JavaScript. Так нет ничего проще. Передаем строку методу <strong>JSON.parse()</strong></p>
<pre class="brush: jscript;">var oAuto = JSON.parse(sAuto);</pre>
<p>и получаем объект JavaScript.</p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_json/json.zip">исходный код</a> примера, и испытать его на своем сайте.</p></blockquote>
<p>Необходимо упомянуть также, что метод <strong>JSON.parse()</strong> может принимать опционально еще один параметр.</p>
<pre class="brush: jscript;">var myObject = JSON.parse(myJSONtext, filter);</pre>
<p>Более полную информацию Вы всегда можете найти на сайте <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>.</p>
<p>Мы вкратце познакомились с тем, как можно работать с данными в формате <strong>JSON</strong> на стороне клиента, а как обстоит дело при работе на стороне сервера? Оказывается существует довольно много программного обеспечения для работы с <strong>JSON</strong> в языках на которых пишутся серверные сценарии. <strong>JSON</strong> может применяться в <strong>Pyton</strong>, <strong>C#/.NET</strong>, <strong>PHP</strong>, <strong>ColdFusion</strong>, <strong>Perl</strong>, <strong>Java</strong> и т.д. Полный список можно найти на <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>, а я для примера выбрал <strong>PHP</strong>, как наиболее близкий мне.</p>
<p>Утилита <strong>JSON-PHP</strong> написана Михалем Мигурски (Michal Migurski). Сама утилита &#8211; это один файл JSON.PHP, но для работы с утилитой требуется библиотека <strong>PEAR</strong> (PHP Extension and Application Repository). Скачать утилиту можно отсюда <a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198" target="_blank">http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a>.</p>
<blockquote><p>Если Ваш хостер не удосужился включить библиотеку PEAR &#8211; не расстраивайтесь. Вы вполне можете сделать все самостоятельно. Не обязательно даже иметь права администратора сервера. Я приведу ссылки. Кому очень понадобится &#8211; тот обязательно разберется.<br />
<a href="http://pear.php.net/manual/en/installation.getting.php" target="_blank">http://pear.php.net/manual/en/installation.getting.php</a> &#8211; см. раздел &laquo;PEAR in hosting environments&raquo;.<br />
В принципе нужно только получить инсталляционный файл, загрузить его на свой сервер, вызвать в адресной строке браузера и далее только следовать инструкциям.<br />
А <a href="http://subscribe.ru/archive/inet.webbuild.php5whatsnew/200512/30010819.html" target="_blank">здесь</a> посмотрите раздел &laquo;Динамическая коррекция пути к включаемым файлам&raquo;.</p></blockquote>
<p>Разберем все на примере. Пусть имеем такое определение класса (для PHP5)</p>
<pre class="brush: php;">
class Auto {
  public $firm;
  public $model;
  public $year;
  public $price;
  public $sellers;

  function Auto($firm,$model,$year,$price) {
    $this-&gt;firm = $firm;
    $this-&gt;model = $model;
    $this-&gt;year = $year;
    $this-&gt;price = $price;
    $this-&gt;sellers = array();
  }
}</pre>
<p>Используем этот класс так:</p>
<pre class="brush: php;">
$oAuto = new Auto(&quot;Audi&quot;, &quot;A6&quot;, 2008, 78000);
$oAuto-&gt;sellers[0] = &quot;Фирма А&quot;;
$oAuto-&gt;sellers[1] = &quot;Фирма Б&quot;;
$oAuto-&gt;sellers[2] = &quot;Фирма В&quot;;
</pre>
<p>Теперь то, что нас интересует больше всего. Подключаем утилиту <strong>JSON-PHP</strong>, создаем новый экземпляр объекта <strong>Services_JSON</strong> и передаем объект <strong>$oAuto</strong> методу <strong>encode()</strong>:</p>
<pre class="brush: php;">require_once(&quot;JSON.php&quot;);
$json = new Services_JSON();
$sJSONText = $json-&gt;encode($oAuto);</pre>
<p>В результате переменная <strong>$sJSONText</strong> будет содержать строку в формате <strong>JSON</strong>:</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,&quot;price&quot;:78000,
&quot;sellers&quot;:[&quot;\u0424\u0438\u0440\u043c\u0430 \u0410&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0411&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0412&quot;]}</pre>
<blockquote><p>Здесь хочу обратить Ваше внимание на то, что утилита <strong>JSON-PHP</strong> понимает строки или в <strong>ASCII</strong>, или в <strong>UTF-8</strong>. Поэтому существенный выигрыш можно получить при использовании латинских символов, тогда как использование кириллицы в кодировке windows-1251 может привести к увеличению объема данных. Обратите внимание на то место в строке, где должны передаваться Фирма А, Фирма Б, Фирма В.</p></blockquote>
<p>Но цели мы достигли &#8211; объект <strong>$oAuto</strong> готов к передаче в сценарий на языке JavaScript.</p>
<p>Разберем обратную операцию &#8211; преобразование строки текста в формате <strong>JSON</strong> в объект <strong>PHP</strong>. Все, что для этого нужно сделать, это передать строку методу <strong>decode()</strong>:</p>
<pre class="brush: php;">$value = $json-&gt;decode($sJSONText);</pre>
<p>Если теперь использовать например <strong>print_r()</strong>, то мы сможем убедиться, что объект был создан:</p>
<pre class="brush: php;">
( [firm] =&gt; Audi [model] =&gt; A6
[year] =&gt; 2008 [price] =&gt; 78000
[sellers] =&gt; Array ( [0] =&gt; Фирма А [1] =&gt; Фирма Б [2] =&gt; Фирма В ) )</pre>
<p>Все это есть в примере, который Вы сможете скачать. Пример включает и утилиту <strong>JSON-PHP</strong>. Естественно, Вам придется немного поправить пример в той части, где корректируются пути к библиотеке <strong>PEAR</strong>, либо удалить этот фрагмент кода, если библиотека у Вас уже подключена.</p>
<blockquote><p>Архив с примером можно <a href="http://www.linkexchanger.su/example_json/json2.zip">скачать</a> здесь.</p></blockquote>
<p>Что можно еще сказать? Разве что упомянуть о том, что утилита <strong>JSON-PHP</strong> не единственная для работы с <strong>JSON</strong> на стороне сервера. Существует расширение PHP &#8211; <strong>php-json</strong> (написано на C Омаром Килани (Omar Kilani)), однако для его установки потребуется умение устанавливать модули расширения PHP. Вот и все, пожалуй.</p>
<p>Буду рад, если найдете время для того, чтобы оставить свои отзывы&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/41.html/feed</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>Что такое JSON?</title>
		<link>http://www.linkexchanger.su/2008/40.html</link>
		<comments>http://www.linkexchanger.su/2008/40.html#comments</comments>
		<pubDate>Thu, 28 Feb 2008 05:46:28 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/40.html</guid>
		<description><![CDATA[JSON (JavaScript Object Notation &#8211; представление объектов JavaScript) &#8211; легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на литералах массивов и объектов. JSON &#8211; это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>JSON</strong> (JavaScript Object Notation &#8211; представление объектов JavaScript) &#8211; легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на <strong>литералах</strong> массивов и объектов. JSON &#8211; это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, определения JSON могут быть просто включены в сценарии JavaScript. Формат JSON предложен программистом Дугласом Крокфордом (Douglas Crockford).<span id="more-40"></span></p>
<p>Может я зайду издалека, но для того чтобы действительно понять JSON, сначала поймем (вспомним) синтаксис массивов и объектов в литеральной нотации JavaScript.</p>
<p><strong>Массивы как литералы</strong><br />
Массив в JavaScript можно определить с помощью конструктора Array, например так:</p>
<pre class="brush: jscript;">var aData = new Array(&quot;строка&quot;, true, 43, null);</pre>
<blockquote><p>В JavaScript массивы нетипизированные, поэтому в них можно хранить различные типы данных. В примере массив содержит строку, логическое значение, число и значение null.</p></blockquote>
<p>Массив же, описываемый как литерал, можно определить с помощью квадратных скобок, внутри &#8211; значения элементов массива, через запятую. Вот как будет выглядеть тот же самый массив, но в литеральной нотации:</p>
<pre class="brush: jscript;">var aData = [&quot;строка&quot;, true, 43, null];</pre>
<p>Обращаться к отдельным элемента массива можно указывая имя массива и номер элемента:</p>
<pre class="brush: jscript;">alert(aData[0]);
alert(aData[1]);</pre>
<p><strong>Объекты как литералы</strong><br />
Объекты в JavaScript определяются с помощью конструктора Object, например так:</p>
<pre class="brush: jscript;">var oAuto = new Object();
oAuto.firm = &quot;Audi&quot;;
oAuto.model = &quot;A6&quot;;
oAuto.year = 2008;
oAuto.price = 78000;</pre>
<p>Тот же самый код, но в литеральной нотации будет выглядеть так:</p>
<pre class="brush: jscript;">var oAuto = {
  &quot;firm&quot;:&quot;Audi&quot;,
  &quot;model&quot;:&quot;A6&quot;,
  &quot;year&quot;:2008,
  &quot;price&quot;:78000
};</pre>
<p>Этот код создает объект со свойствами firm, model, year и price и обращаться к ним можно таким образом:</p>
<pre class="brush: jscript;">alert(oAuto.model);
alert(oAuto.year);</pre>
<p>но можно использовать и синтаксис массивов обращаясь к свойствам объекта таким образом:</p>
<pre class="brush: jscript;">alert(oAuto[&quot;model&quot;]);
alert(oAuto[&quot;year&quot;]);</pre>
<p>В литеральной нотации описания массивов и объектов можно вкладывать друг в друга, создавая таким образом <strong>объект массивов</strong> или <strong>массив объектов</strong>. Посмотрите этот код:</p>
<pre class="brush: jscript;">var aAuto = [
  {
    &quot;firm&quot;:&quot;BMW&quot;,
    &quot;model&quot;:&quot;X5&quot;,
    &quot;year&quot;:2007,
    &quot;price&quot;:99000
  },
  {
    &quot;firm&quot;:&quot;Audi&quot;,
    &quot;model&quot;:&quot;A6&quot;,
    &quot;year&quot;:2008,
    &quot;price&quot;:78000
  },
  {
    &quot;firm&quot;:&quot;Volkswagen&quot;,
    &quot;model&quot;:&quot;Touareg 7L&quot;,
    &quot;year&quot;:2006,
    &quot;price&quot;:45000
  }
];</pre>
<p>Мы создали массив aAuto, который содержит три объекта. Комбинируя синтаксис обращения к массивам с синтаксисом обращения к объектам попробуем получить год выпуска второго автомобиля:</p>
<pre class="brush: jscript;">alert(aAuto[1].year); // получаем 2008</pre>
<p>Можно сделать наоборот, и описать объект массивов:</p>
<pre class="brush: jscript;">var oAuto = {
  &quot;firm&quot;:[&quot;BMW&quot;, &quot;Audi&quot;, &quot;Volkswagen&quot;],
  &quot;model&quot;:[&quot;X5&quot;, &quot;A6&quot;, &quot;Touareg 7L&quot;],
  &quot;year&quot;:[2007, 2008, 2006],
  &quot;price&quot;:[99000, 78000, 45000]
};</pre>
<p>в этом случае обращаемся сначала к объекту, а затем к массиву внутри него:</p>
<pre class="brush: jscript;">alert(oAuto.year[1]); // получаем 2008</pre>
<p>Вот такое длинное получилось предисловие, но зато теперь будет гораздо понятнее при чем здесь вообще <strong>JSON</strong>&#8230;</p>
<p><strong>JSON</strong> &#8211; комбинация массивов и объектов и предназначен только для хранения данных. Как следствие, <strong>JSON</strong> не может иметь переменных и не допускает никаких операций над ними. Давайте попробуем записать предыдущий пример, используя синтаксис <strong>JSON</strong>:</p>
<pre class="brush: jscript;">{
  &quot;firm&quot;:[&quot;BMW&quot;, &quot;Audi&quot;, &quot;Volkswagen&quot;],
  &quot;model&quot;:[&quot;X5&quot;, &quot;A6&quot;, &quot;Touareg 7L&quot;],
  &quot;year&quot;:[2007, 2008, 2006],
  &quot;price&quot;:[99000, 78000, 45000]
}</pre>
<p><strong>Обратите внимание</strong>, что пропали имя переменной и точка-запятая. Передача такого объекта с использованием HTTP-протокола будет происходить очень быстро, поскольку содержит минимум символов. Получив такие данные на стороне клиента и записав ее в какую-либо переменную (например sData) мы получаем строку информации.<br />
<strong>Обратите внимание</strong>: именно строку, а совсем не объект или объект с вложенными в него массивами. Преобразуем строку в объект, используя функцию <strong>eval()</strong>.</p>
<pre class="brush: jscript;">var oAuto = eval(&quot;(&quot; + sData + &quot;)&quot;);</pre>
<p>В результате этого получится объект, который мы описали чуть выше.</p>
<p><strong>Преимущество JSON перед XML</strong><br />
Так в чем же все-таки состоит преимущество JSON перед XML?</p>
<blockquote><p>Здесь речь идет исключительно о преимуществах и недостатках только лишь с точки зрения организации обмена данными в Сети.</p></blockquote>
<p>В том, что язык XML оказывается очень избыточным при сравнении с JSON. Давайте убедимся в этом на простом примере. Одни и те же данные представим в формате XML и в формате JSON.</p>
<pre class="brush: xml;">&lt;general&gt;
  &lt;cars&gt;
    &lt;car&gt;
      &lt;firm&gt;BMW&lt;/firm&gt;
      &lt;model&gt;X5&lt;/model&gt;
      &lt;year&gt;2007&lt;/year&gt;
      &lt;price&gt;99000&lt;/price&gt;
    &lt;/car&gt;
    &lt;car&gt;
      &lt;firm&gt;Audi&lt;/firm&gt;
      &lt;model&gt;A6&lt;/model&gt;
      &lt;year&gt;2008&lt;/year&gt;
      &lt;price&gt;78000&lt;/price&gt;
    &lt;/car&gt;
    &lt;car&gt;
      &lt;firm&gt;Volkswagen&lt;/firm&gt;
      &lt;model&gt;Touareg 7L&lt;/model&gt;
      &lt;year&gt;2006&lt;/year&gt;
      &lt;price&gt;45000&lt;/price&gt;
    &lt;/car&gt;
  &lt;/cars&gt;
&lt;/general&gt;</pre>
<p>так это выглядит в формате XML, а ниже &#8211; в формате JSON:</p>
<pre class="brush: jscript;">{ &quot;general&quot;:
  {
    &quot;cars&quot;:[
      {
        &quot;firm&quot;:&quot;BMW&quot;,
        &quot;model&quot;:&quot;X5&quot;,
        &quot;year&quot;:2007,
        &quot;price&quot;:99000
      },
      {
        &quot;firm&quot;:&quot;Audi&quot;,
        &quot;model&quot;:&quot;A6&quot;,
        &quot;year&quot;:2008,
        &quot;price&quot;:78000
      },
      {
        &quot;firm&quot;:&quot;Volkswagen&quot;,
        &quot;model&quot;:&quot;Touareg 7L&quot;,
        &quot;year&quot;:2006,
        &quot;price&quot;:45000
      }
    ]
  }
}</pre>
<p>При использовании формата JSON выигрыш составит 42 байта, а без учета пробелов и вовсе 86 байт. А если вспомнить еще и о том, что данные в формате JSON не требуют дополнительного синтаксического анализа на стороне клиента &#8211; преимущество JSON перед XML в аспекте передачи данных от сервера клиенту становится очевидным&#8230;</p>
<p>По этой теме могу порекомендовать прочитать переводную статью <a href="http://habrahabr.ru/blog/webdev/23779.html" target="_blank"><strong>JSON и XML. Что лучше?</strong></a> на Хабрахабре, а я надеюсь, что мне удастся в ближайшем будущем подробнее рассказать о утилитах для работы с JSON как на стороне клиента, так и на стороне сервера.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/40.html/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>
