суббота, 9 июля 2011 г.

Функции json_encode() и json_decode() на PHP

Я занимаюсь разработкой разработкой веб-приложений на PHP, которые пользователи могут скачать и поставить у себя на хостинге. А поскольку на виртуальных хостингах в России PHP обновляется очень медленно, то нет возможности пользоваться многими полезными расширениями PHP, т.к. их может не быть.
Один из таких примеров - это функции для работы с JSON: json_encode() и json_decode(). Подробнее об этих функциях можно прочитать в документации http://www.php.net/manual/ru/ref.json.php
Проблема в том, что JSON extension входит в состав PHP по умолчанию только, начиная с версии 5.2.0
В реальности на сегодняшний день до сих пор на многих хостингах в рунете установлен PHP 5.1.6

Довольно сложно представить современное веб-приложение/сайт без использования ajax, и функция json_encode() становится просто необходимой для формирования JSON.
И если у вас нет json extension вы получите одну из ошибок:
Fatal error: Call to undefined function json_encode() in ...
Fatal error: Call to undefined function json_decode() in ...
Что же делать?
Нужно реализовать эти функции на PHP!
Можно, конечно, использовать уже готовое, например: http://pear.php.net/package/Services_JSON/
Но! Я встретил уже два сервера, где Service_JSON работал некорректно с русским языком. Тогда не было времени разбираться с причинами и было решено написать свою функцию json_encode() собрав воедино все полезное из комментариев на php.net.

Чтобы не приходилось думать о наличии json в PHP лучше всего делать так:
if (!function_exists('json_encode')) {
      function json_encode($value)
      {
           // Тут реализация функции json_encode на PHP
      }
}

if (!function_exists('json_decode')) {
      function json_encode($json, $assoc = false)
      {
           // Тут реализация функции json_encode на PHP
      }
}
После этого вы можете спокойно везде использовать функции json_encode() и json_decode() вне зависимости от версии PHP и наличия json extension.

Все исходники выложены на гитхабе: https://github.com/alexmuz/php-json
Функции реализованы как по отдельности в процедурном стиле (файлы json_encode.php и json_decode.php - можно подключать только то, что нужно), так и отдельным статическим классом phpJson.

Простейший вариант использования:
require_once("phpJson.class.php");
После этого функции json_encode и json_decode станут доступны.