JSON - один из самых популярных форматов для обмена данными в веб-разработке. Благодаря простому синтаксису на основе пар ключ-значение он легко читается как людьми, так и машинами. При этом JSON более компактный и быстрый в обработке, чем например XML.
История создания формата JSON
JSON был придуман Дугласом Крокфордом в начале 2000-х годов как альтернатива XML. Изначально формат назывался JSON (JavaScript Object Notation), поскольку был тесно связан с JavaScript. Однако в дальнейшем название сократили до JSON, чтобы подчеркнуть независимость от конкретного языка программирования.
Первая спецификация JSON в виде RFC 4627 была опубликована в 2006 году. С тех пор формат активно эволюционировал и использовался для обмена данными в веб-приложениях. Сегодня JSON является фактическим стандартом, поддерживаемым всеми популярными языками программирования.
Структура данных JSON
JSON основан на двух структурах данных:
- Объект - неупорядоченная коллекция пар "ключ:значение"
- Массив - упорядоченный список значений
Значениями в JSON могут быть:
- Строка в двойных кавычках
- Число
- Логическое значение (true/false)
- null
- Вложенный объект или массив
Благодаря простой структуре, данные JSON легко читаются как людьми, так и машинами.
Преимущества JSON перед XML
Почему JSON вытеснил более старый формат обмена данными XML?
- Проще для парсинга и создания, меньше избыточности
- Компактнее по размеру
- Быстрее обрабатывается
- Легче читается человеком
При этом JSON уступает XML в некоторых областях, например, при описании сложных иерархических данных. Но для большинства задач обмена данными в вебе он оказался оптимальным решением.
Популярность JSON в веб-разработке
Сегодня JSON фактически стал стандартом де-факто для:
- Обмена данными между веб-сервисами
- Хранения данных в базах типа MongoDB
- Формата запросов и ответов при AJAX
Почти все популярные языки и платформы поддерживают работу с JSON - от PHP до JavaScript. Даже в MySQL появились типы данных JSON.
Встроенная поддержка JSON в PHP
PHP поддерживает работу с JSON данными из коробки благодаря одноименному расширению. Оно входит в состав ядра начиная с версии 5.2.0.
Основные функции для работы с JSON:
- json_encode() - кодирует данные из PHP в JSON
- json_decode() - декодирует из JSON обратно в PHP
Также есть вспомогательные функции для работы с ошибками и опциональными параметрами.
Кодирование данных в JSON с помощью json_encode
Рассмотрим пример кодирования простого массива в JSON с помощью json_encode():
$data = array('firstName' => 'Иван', 'lastName' => 'Петров'); $json = json_encode($data); // $json = {"firstName":"Иван","lastName":"Петров"}
Как видно, ассоциативный массив превратился в объект JSON. Аналогично можно закодировать в JSON и другие типы данных PHP: объекты, вложенные структуры и т.д.
Декодирование JSON обратно в PHP переменные
Для декодирования JSON используется функция json_decode():
$json = '{"firstName":"Иван","lastName":"Петров"}'; $data = json_decode($json); // $data = array('firstName' => 'Иван', 'lastName' => 'Петров')
По умолчанию возвращается объект. Чтобы получить ассоциативный массив, нужно передать вторым параметром true.
Обработка ошибок с помощью json_last_error()
Функции json_encode() и json_decode() не выбрасывают исключения при ошибках, а просто возвращают NULL.
Чтобы проверить, в чем была проблема, используется функция json_last_error():
$json = json_encode($data); if($json === null) { echo 'Ошибка JSON: ' . json_last_error(); }
Это позволит выявить и исправить проблемы при работе с JSON.
Расширенные возможности json_encode()
Помимо основного функционала, в json_encode() есть дополнительные опции:
- JSON_UNESCAPED_UNICODE - кодирование юникодных символов
- JSON_NUMERIC_CHECK - проверка числовых значений
- JSON_PRETTY_PRINT - форматирование для удобочитаемости
Это позволяет тонко настроить процесс кодирования для решения специфических задач.
Отправка данных в формате JSON
$data = array(...); $json = json_encode($data); header('Content-Type: application/json'); echo $json;
Таким образом можно легко отдавать JSON, например, для ajax-запросов из JavaScript.
$data = ['текст' => 'Привет мир!']; $json = json_encode($data, JSON_UNESCAPED_UNICODE); // {"текст":"Привет мир!"}
Опция JSON_UNESCAPED_UNICODE решает проблему с кодировкой русских символов.
Прием JSON-данных из внешнего сервиса или приложения
$json_string = file_get_contents('php://input'); $data = json_decode($json_string, true);
Таким способом можно получить JSON, например, из POST-запроса.
Рекомендации по оптимизации
Чтобы избежать проблем при работе с JSON в PHP, рекомендуется:
- Использовать актуальную версию PHP >= 5.2.0
- Проверять возвращаемые значения на NULL при ошибках
- Тестировать производительность на больших объемах данных
При соблюдении этих правил интеграция JSON в PHP-приложение пройдет гладко. Конечно, если вы не слишком хорошо знакомы с языком кодирования, придется немного посидеть, чтобы разбраться.