Открыть сервис

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 →