json error - решение проблемы json_decode() или json_encode()

Четверг, 13 Октябрь 2011

 

В одном из последних проектов на Joomla с K2, столкнулся со следующей проблемой: на сервере заказчика не работала функция декодирования json данных из extrafields полей таблиц К2. Как выяснилось поддержка этой функции осуществляется библиотекой JSON.php, которая включена в ядро PHP только с версии 2.5.0, а на сервере заказчика стоял старенький PHP v 5.1.6, именно поэтому и выводилось сообщение об ошибке (json error) - Call to undefined function json_decode().

 

Сроки поджимали, а отказаться от использования этой функции декодирования было ну никак нельзя, она использовалась для вывода значений из дополнительных полей объектов K2. Просто иначе эти значения нельзя получить, так как в полях таблицы "jos_k2_items" значения этих дополнительных полей хранятся в json закодированной форме и выглядит следующим образом:

 

  •  
  • [{"id":"1","value":"\u041a\u0440\u0430\u0439\u0441\u043b\u0435\u0440"},{"id":"2","value":"300\u0421"},{"id":"3","value":"\u0431\u0435\u043b\u044b\u0439"},{"id":"4","value":"10"},{"id":"5","value":"2008"},{"id":"6","value":"50$"}]
  •  

 

На самом же деле это структура содержащая набор пар ключ/значение, а именно объект Object, который повсеместно используется в joomla. Декодировав же эту json строку функцией json_decode(), получим объект со следующим содержимым:

 

  •  
  • [0] => stdClass Object ( [id] => 1 [value] => Toyota )
  • [1] => stdClass Object ( [id] => 2 [value] => Avensis )
  • [2] => stdClass Object ( [id] => 3 [value] => белый )
  • [3] => stdClass Object ( [id] => 4 [value] => 5 )
  • [4] => stdClass Object ( [id] => 5 [value] => 20011 )
  • [5] => stdClass Object ( [id] => 6 [value] => 60$ )
  • )
  •  

 

Это массив объектов с id соответствующими определенному дополнительному полю K2 и его значение.

 

Так как отказаться от использования json_decode() было нельзя, было найдено решение которое очень просто позволяет подключить недостающую библиотеку JSON в устаревшую версию PHP, дабы не обновлять весь PHP. Решение состоит в том что следует скачать саму библиотеку JSON.tar.gz, разархивировать ее содержимое в нужную папку на вашем сервере (к примеру я поместил папку с библиотекой JSON в "libraries/JSON" - joomla).

 

После этого в нужном месте, там где вы используете функцию json_decode() или json_encode(), подключаете библиотеку:

 

  •  
  • <?php
  • include("./libraries/JSON/JSON.php");
  • ?>
  •  

 

А затем перед своими функциями кодирования - json_encode() или декодирования json_encode() прописываете следующий код, который использует библиотеку JSON :

 

  •  
  • <?php
  • // Future-friendly json_encode
  • if( !function_exists('json_encode') ) {
  • function json_encode($data) {
  • $json = new Services_JSON();
  • return( $json->encode($data) );
  • }
  • }
  •  
  •  
  • //или
  •  
  • // Future-friendly json_decode
  • if( !function_exists('json_decode') ) {
  • function json_decode($data) {
  • $json = new Services_JSON();
  • return( $json->decode($data) );
  • }
  • }
  • ?>
  •  

 

После этого проблема "json error" для PHP <2.5.0 решается и становится возможным использование функция json_encode() и json_encode().

 

PS. Читайте последние записи RSS Подписка на RSS

 

Метки:

Похожие статьи:

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