JSON
JSON (JavaScript Object Notation, произносится «джейсон») — это текстовый формат обмена данными, основанный на синтаксисе объектов языка JavaScript. Он является лёгким, удобным для чтения человеком и простым для разбора и генерации компьютерными программами. JSON используется для передачи структурированных данных между сервером и веб-клиентом, а также в конфигурационных файлах, базах данных и API.
История
Формат JSON был разработан программистом Дугласом Крокфордом в начале 2000-х годов. Первоначально он предназначался для обмена данными в веб-приложениях, где требовалась альтернатива более громоздкому XML. В 2001 году Крокфорд и Чип Морнингстар зарегистрировали первый домен json.org, где опубликовали спецификацию. В 2006 году JSON был стандартизирован как RFC 4627, а в 2013 году — как ECMA-404. В 2017 году вышла обновлённая версия стандарта RFC 8259, которая является действующей на текущий момент.
Ключевым преимуществом JSON перед XML стала его компактность и скорость обработки: для разбора JSON не требуется парсер с поддержкой сложных схем и пространств имён. Это привело к тому, что JSON стал де-факто стандартом для REST API, конфигурационных файлов (например, в Node.js, Docker) и хранения данных в NoSQL-базах данных (MongoDB, CouchDB).
Синтаксис
Формат JSON поддерживает два типа структур данных: коллекцию пар «ключ-значение» (объект) и упорядоченный список значений (массив). Эти структуры могут быть вложены друг в друга произвольным образом.
Типы данных
JSON поддерживает четыре примитивных типа и два структурных:
- Числа (number): целые или с плавающей точкой. Записываются в десятичной системе, могут содержать экспоненциальную часть (например,
1.5e10). Не поддерживают NaN, Infinity или ведущие нули. - Строки (string): последовательность символов Unicode, заключённая в двойные кавычки. Содержат экранированные последовательности (например,
\n,\t,\\,\"). Одинарные кавычки недопустимы. - Логические значения (boolean):
trueилиfalse. - Null: пустое значение, обозначается ключевым словом
null. - Объекты (object): неупорядоченный набор пар «ключ-значение», заключённый в фигурные скобки
{}. Ключ — строка в двойных кавычках, после которой ставится двоеточие, пары разделяются запятыми. - Массивы (array): упорядоченный список значений, заключённый в квадратные скобки
[]. Значения разделяются запятыми.
Пример JSON-документа
``json { "name": "Иван Петров", "age": 30, "isEmployee": true, "address": { "city": "Москва", "street": "Тверская", "zipCode": null }, "phoneNumbers": [ "+7-495-123-45-67", "+7-916-987-65-43" ] } ``
Ограничения и правила
- JSON не поддерживает комментарии. Любые комментарии в файле нарушают спецификацию.
- Пробелы (пробел, табуляция, перевод строки) игнорируются между лексемами, но не внутри строк.
- Ключи объекта должны быть уникальными. Повтор ключа в одном объекте недопустим (поведение парсера при дублировании не определено стандартом, но обычно последнее значение перезаписывает предыдущее).
- Замыкающие запятые (trailing comma) запрещены.
Применение
Веб-API и REST
JSON является основным форматом для передачи данных в RESTful API. Сервер возвращает клиенту JSON-ответ, который браузер или мобильное приложение легко разбирает с помощью встроенного метода JSON.parse() в JavaScript. Большинство современных веб-фреймворков (Django, Flask, Express.js, Spring Boot) имеют встроенную поддержку сериализации и десериализации JSON.
Конфигурационные файлы
Многие инструменты и платформы используют JSON для хранения конфигурации. Например:
package.jsonв Node.js — описание зависимостей, скриптов и метаданных проекта.composer.jsonв PHP — управление зависимостями.manifest.jsonв веб-приложениях (PWA) — настройки иконок, экрана загрузки, разрешений.docker-compose.json(реже, обычно YAML) — конфигурация контейнеров.
Базы данных
NoSQL-базы данных, такие как MongoDB, CouchDB и Firebase, хранят данные в формате, близком к JSON (BSON — бинарный JSON в MongoDB). Это позволяет гибко работать с документами без заранее заданной схемы.
Обмен данными между системами
JSON используется для сериализации объектов при передаче между микросервисами, в очередях сообщений (RabbitMQ, Kafka) и в файлах журналов (логи). Его компактность и читаемость делают его предпочтительным выбором для интеграции разнородных систем.
Сравнение с другими форматами
JSON vs XML
- Размер: JSON обычно компактнее XML из-за отсутствия закрывающих тегов и меньшего количества символов.
- Читаемость: JSON легче читается человеком, особенно для простых структур.
- Скорость парсинга: JSON разбирается быстрее, так как не требует сложного анализа атрибутов и пространств имён.
- Поддержка схем: XML имеет мощные схемы (XSD, DTD), JSON — более простые (JSON Schema).
- Типы данных: JSON поддерживает числа, строки, булевы значения и null напрямую; XML представляет всё как строки, что требует дополнительной конвертации.
JSON vs YAML
- Синтаксис: YAML использует отступы для вложенности, что делает его более компактным, но подверженным ошибкам при редактировании.
- Комментарии: YAML поддерживает комментарии, JSON — нет.
- Сложность: YAML имеет больше возможностей (якоря, теги, многострочные строки), что может быть избыточно для простых данных.
- Распространённость: JSON доминирует в веб-API, YAML чаще используется в конфигурациях (Ansible, Kubernetes, Docker Compose).
JSON vs Protocol Buffers (protobuf)
- Размер: Protocol Buffers (Google) — бинарный формат, значительно компактнее JSON.
- Скорость: protobuf сериализуется и десериализуется быстрее, так как не требует текстового разбора.
- Читаемость: JSON читаем человеком, protobuf — нет.
- Типизация: protobuf требует жёстко заданной схемы, JSON может быть полностью динамическим.
Инструменты и библиотеки
Для работы с JSON существует множество библиотек на всех популярных языках программирования:
- JavaScript: встроенные
JSON.parse()иJSON.stringify(). - Python: модуль
jsonиз стандартной библиотеки. - Java: библиотеки Jackson, Gson, org.json.
- C#: пространство имён
System.Text.Json(встроено в .NET Core 3.0+). - PHP: функции
json_encode()иjson_decode(). - Ruby: модуль
jsonиз стандартной библиотеки. - Go: пакет
encoding/jsonиз стандартной библиотеки.
Для валидации JSON-документов существует JSON Schema — язык описания структуры и ограничений, позволяющий проверять корректность данных.
Критика и ограничения
- Отсутствие комментариев: усложняет документирование конфигурационных файлов.
- Ограниченный набор типов данных: нет поддержки дат, бинарных данных, специальных числовых значений (NaN, Infinity). Разработчики вынуждены использовать соглашения, например, представлять даты как строки в формате ISO 8601.
- Проблемы с безопасностью: при неправильной обработке JSON может быть уязвим для атак типа «инъекция» (JSON injection) или использования
eval()в старых браузерах. - Отсутствие стандартного способа ссылаться на части документа (в отличие от XML с XPath). JSON Pointer (RFC 6901) решает эту проблему частично, но не является частью базового стандарта.
Интересные факты
- Название «JSON» не является аббревиатурой, а происходит от «JavaScript Object Notation». Однако формат не привязан к JavaScript и поддерживается практически всеми языками.
- Дуглас Крокфорд, создатель JSON, написал первую спецификацию на двух листах бумаги. Он также разработал JSLint — инструмент для проверки кода JavaScript, в который включил валидатор JSON.
- В 2013 году JSON был принят как международный стандарт ECMA-404, а в 2017 году — как ISO/IEC 21778:2017.
- Несмотря на то, что JSON часто ассоциируется с вебом, он активно используется в игровых движках (Unity, Unreal Engine) для хранения игровых данных, диалогов и настроек.
- Существует формат JSON5 (JSON5.org), который добавляет комментарии, одинарные кавычки, замыкающие запятые и другие улучшения, но не является стандартом.
Источники
- RFC 8259 — The JavaScript Object Notation (JSON) Data Interchange Format
- ECMA-404 — The JSON Data Interchange Syntax
- ISO/IEC 21778:2017 — Information technology — The JSON data interchange format
- Crockford, D. (2006). JSON: The Fat-Free Alternative to XML
- Официальный сайт JSON (json.org)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →