JSON
JSON (JavaScript Object Notation — «нотация объектов JavaScript») — это общепризнанный международный текстовый формат обмена и хранения структурированных данных, стандартизированный спецификациями RFC 8259 и ECMA-404. Разработанный Дугласом Крокфордом в начале 2000-х годов как компактная и легковесная альтернатива XML, формат стал де-факто фундаментом веб-коммуникаций: он используется в интерфейсах RESTful API, протоколах авторизации JWT, семантической разметке Schema.org (JSON-LD), нативных JSON-типах современных СУБД (MySQL, PostgreSQL) и файлах конфигурации.
История создания, философия и международные стандарты
В конце 1990-х и начале 2000-х годов доминирующим стандартом обмена данными в корпоративных веб-сервисах был XML. Однако его громоздкость порождала проблемы:
- Кризис XML-синтаксиса: бесконечные парные теги (
<item>...</item>) раздували объем передаваемого по сети трафика в разы, а парсинг через громоздкие DOM/SAX-парсеры создавал высокую нагрузку на процессор.
- Идея Дугласа Крокфорда (2001 год): предложить минималистичный текстовый формат на основе нотации литералов объектов языка JavaScript (ECMAScript 3), понятный человеку и мгновенно разбираемый машиной без специализированных библиотек.
- Стандартизация: формат закреплен стандартами RFC 8259, ECMA-404 и ISO/IEC 21778:2017. Официальный MIME-тип —
application/json, кодировка по умолчанию — UTF-8.
- Языковая независимость: несмотря на название, JSON является платформонезависимым форматом. Сегодня высокоскоростные библиотеки для парсинга и сериализации JSON встроены во все языки программирования (PHP, Python, Go, C#, Java).
Синтаксическая модель и 6 базовых типов данных
Спецификация JSON намеренно лаконична и включает всего шесть универсальных типов данных, комбинируемых в любые структуры:
Базовые строительные блоки формата JSON:
Объект (Object): неупорядоченный набор пар «ключ-значение», заключенный в фигурные скобки { "ключ": значение }. Имена ключей обязаны быть строками в двойных кавычках.
Массив (Array): упорядоченный список значений в квадратных скобках [ 1, "текст", true ].
Строка (String): последовательность Unicode-символов в двойных кавычках с поддержкой экранирования (кавычки, слеши, управляющие символы перевода строк).
Число (Number): целые и вещественные числа (42, 3.14, 1e-5) без различия типов.
Логический тип (Boolean): строгие литералы в нижнем регистре true или false.
Нулевое значение (Null): специальный литерал отсутствия значения null.
Строгие ограничения: в стандартном JSON категорически запрещены одинарные кавычки, комментарии (//), функции, значение undefined и висячие запятые (trailing commas) в конце списков.
JSON vs XML, YAML и бинарные протоколы (Protobuf)
Сравнение форматов объясняет, почему именно JSON завоевал статус базового языка веб-интернета и REST API:
Сопоставление форматов сериализации данных:
JSON против XML: JSON на 30–60% компактнее за счет отсутствия закрывающих тегов, значительно быстрее парсится и нативно мапится в структуры данных языков программирования без сложных XSLT-трансформаций.
JSON против YAML: YAML превосходен для конфигурационных файлов благодаря поддержке комментариев и удобному синтаксису, но парсится в 10–20 раз медленнее JSON и уязвим к ошибкам отступов при сетевой передаче.
JSON против Protocol Buffers / MessagePack: бинарные протоколы компактнее и быстрее в высоконагруженных микросервисах (gRPC), однако требуют компиляции схем и лишены человекочитаемости, необходимой для веб-отладки.
Идеальный баланс простоты отладки в браузерной консоли и скорости парсинга закрепил за JSON лидерство в клиент-серверном взаимодействии.
Работа с JSON в языках веб-разработки: PHP и JavaScript
В бэкенд- и фронтенд-разработке преобразование структур данных в текстовый JSON и обратно стандартизировано на уровне ядер языков:
- JavaScript: нативные методы
JSON.stringify(data) (сериализация) и JSON.parse(str) (десериализация). Поддерживают функции-трансформеры (replacer и reviver) для фильтрации полей и конвертации дат.
- PHP 8+: функция
json_encode($array, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR) преобразует массивы в валидный JSON без искажения кириллицы и с выбросом исключений JsonException при сбоях.
- Парсинг в ассоциативные массивы: вызов
json_decode($json, true, 512, JSON_THROW_ON_ERROR) с флагом true декодирует объекты в нативные ассоциативные массивы PHP вместо стандартных объектов stdClass.
- Ограничение глубины рекурсии: параметр глубины стека (по умолчанию 512 уровней) защищает стек вызовов PHP от переполнения при атаках с глубоко вложенными структурами.
Нативная поддержка JSON в реляционных СУБД (MySQL и MariaDB)
Начиная с MySQL 5.7 и 8.0, реляционные базы данных поддерживают нативный тип данных JSON, объединяя надежность SQL с гибкостью NoSQL:
Преимущества нативного типа данных JSON в MySQL:
Бинарный формат хранения: документы JSON сохраняются в оптимизированном внутреннем формате, позволяющем серверу считывать конкретные вложенные поля без парсинга всей текстовой строки.
Операторы поиска по путям (JSON Path): стрелочные операторы -> (извлечение с кавычками) и ->> (извлечение чистого значения) для запросов вида SELECT data->>'$.user.email' FROM orders;.
Функциональные индексы: виртуальные генерируемые колонки (Generated Columns) на базе JSON-свойств позволяют вешать стандартные B-Tree индексы на отдельные поля JSON-документов, обеспечивая миллисекундный поиск среди миллионов строк.
В CMS Joomla нативные JSON-поля широко используются для хранения кастомных полей (Custom Fields), конфигураций расширений и гибких параметров макетов.
Безопасность, валидация по JSON Schema и защита от атак
Обработка внешних JSON-данных требует строгого соблюдения правил информационной безопасности:
- Спецификация JSON Schema: стандарт формального описания и декларативной валидации структуры JSON-документов. Позволяет автоматически проверять типы данных, диапазоны значений и обязательные поля в API-запросах.
- Защита от XSS-инъекций: при прямой вставке JSON в HTML-код страницы (например, в переменные скриптов) необходимо экранировать теги (флаг
JSON_HEX_TAG в PHP), чтобы предотвратить внедрение вредоносных тегов <script>.
- Уязвимость Prototype Pollution: в JavaScript-окружении (Node.js) небезопасное слияние невалидированных JSON-объектов со служебными ключами
__proto__ или constructor может скомпрометировать глобальный прототип объекта.
- Экосистема стандартов: JSON стал фундаментом для криптографических веб-токенов JWT (аутентификация в API), семантической разметки JSON-LD (Schema.org) и манифестов ассетов CMS Joomla (
joomla.asset.json).
JSON, JavaScript