json error - решение проблемы json_decode() или json_encode()
В одном из последних проектов на 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(), получим объект со следующим содержимым:
- Array (
- [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
- function json_encode($data) {
- $json = new Services_JSON();
- return( $json->encode($data) );
- }
- }
- //или
- // Future-friendly 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