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

Binary JSON

Binary JSON (BSON, от англ. Binary JSON) — это формат сериализации данных, предназначенный для хранения и обмена структурированной информацией в двоичном виде, основанный на модели данных JSON (JavaScript Object Notation). В отличие от текстового JSON, BSON использует бинарное кодирование, что позволяет более эффективно хранить и передавать данные, а также поддерживает дополнительные типы данных, не предусмотренные стандартом JSON.

История и происхождение

Формат BSON был разработан в 2009 году компанией MongoDB Inc. (ранее 10gen) для использования в одноимённой NoSQL-системе управления базами данных (СУБД) MongoDB. Основной целью создания BSON было обеспечение быстрой сериализации и десериализации данных, а также поддержка типов, отсутствующих в JSON, таких как даты, двоичные данные (BLOB) и числа с плавающей запятой двойной точности. Первая версия спецификации BSON была опубликована в 2010 году. С тех пор формат стал стандартом для внутреннего хранения данных в MongoDB, а также нашёл применение в других проектах и библиотеках, например, в протоколах связи некоторых веб-сервисов и в формате хранения данных в Apache CouchDB (через расширение).

Отличия от JSON

Основное отличие BSON от JSON заключается в способе кодирования данных. JSON — это текстовый формат, основанный на строках, где каждый элемент (ключ, значение, разделитель) представлен в виде читаемого человеком текста. BSON же использует бинарное представление, где каждый элемент имеет фиксированный или переменный размер, а типы данных кодируются числовыми идентификаторами.

Ключевые различия:

  • Типы данных: JSON поддерживает шесть основных типов: строки, числа, логические значения, массивы, объекты и null. BSON расширяет этот набор, добавляя:
  • Дата и время: 64-битное целое число, представляющее количество миллисекунд с 1 января 1970 года по UTC.
  • Двоичные данные (BLOB): Массив байтов, используемый для хранения изображений, аудио, видео или произвольных файлов.
  • Числа с плавающей запятой двойной точности: 64-битное число по стандарту IEEE 754, что позволяет избежать потери точности при вычислениях.
  • Целые числа: 32-битные и 64-битные целые числа (int32, int64), что исключает путаницу с типом Number в JSON.
  • Объекты ObjectId: Уникальные 12-байтовые идентификаторы, используемые в MongoDB.
  • Регулярные выражения: Поддержка регулярных выражений.
  • Код JavaScript: Возможность хранения исполняемого кода.
  • Размер: BSON обычно занимает больше места, чем JSON, из-за добавления служебных полей (например, длины строк и массивов, идентификаторов типов). Однако для данных с большим количеством чисел или двоичных данных BSON может быть компактнее, так как числа хранятся в бинарном виде, а не в виде текстовых строк.
  • Скорость обработки: BSON быстрее сериализуется и десериализуется, чем JSON, так как не требует синтаксического анализа текста (парсинга). Это особенно важно для операций ввода-вывода в базах данных.
  • Читаемость: BSON нечитаем для человека без специальных инструментов, в отличие от текстового JSON.

Структура и формат

BSON-документ представляет собой упорядоченный список пар «ключ-значение». Каждый элемент документа состоит из следующих частей:

  1. Тип данных (1 байт): Числовой код, определяющий тип значения (например, 0x01 для double, 0x02 для строки, 0x08 для boolean).
  2. Имя ключа (строка, завершающаяся нулевым байтом): Название поля, закодированное в UTF-8. Завершается символом \0.
  3. Значение: Данные, соответствующие указанному типу. Для строк сначала указывается длина (4 байта, целое число), затем сама строка (без завершающего нуля). Для массивов и вложенных объектов — рекурсивная структура.

Сам документ начинается с 4-байтового целого числа, указывающего общую длину документа в байтах, и заканчивается нулевым байтом (\0).

Пример структуры (упрощённо)

Для JSON-объекта: ``json { "name": "Alice", "age": 30, "isStudent": false } `` BSON-представление будет выглядеть как последовательность байтов, где:

  • Первые 4 байта — длина документа.
  • Затем идёт поле name: тип (строка), длина строки, сама строка "Alice".
  • Затем поле age: тип (int32), значение 30.
  • Затем поле isStudent: тип (boolean), значение false.
  • Завершающий нулевой байт.

Применение

Базы данных

Основное применение BSON — это СУБД MongoDB. Внутреннее хранение данных в MongoDB осуществляется в формате BSON. Это позволяет:

  • Быстро выполнять запросы и индексацию, так как BSON-документы могут быть напрямую обработаны без дополнительного парсинга.
  • Поддерживать сложные типы данных, такие как вложенные массивы и объекты, а также геопространственные данные.
  • Эффективно хранить большие объёмы данных, особенно с двоичными полями (например, изображения через GridFS).

Протоколы обмена данными

BSON используется в некоторых протоколах для обмена данными между сервером и клиентом, особенно в тех случаях, где важна производительность и поддержка двоичных данных. Например, он применяется в протоколе MongoDB Wire Protocol для взаимодействия с сервером базы данных.

Другие области

  • Файловые форматы: Некоторые приложения используют BSON для хранения конфигурационных файлов или сериализации состояния.
  • Библиотеки и инструменты: Существуют библиотеки для работы с BSON на многих языках программирования, включая C, C++, Java, Python, Ruby, PHP, JavaScript (Node.js) и Go. Они позволяют преобразовывать данные между BSON и нативными структурами языка.

Критика и ограничения

  • Избыточность: BSON часто занимает больше места, чем JSON, особенно для текстовых данных, из-за добавления служебных полей (длина строк, идентификаторы типов). Это может быть неэффективно для хранения в памяти или при передаче по сети с низкой пропускной способностью.
  • Сложность реализации: Разработка собственного парсера BSON сложнее, чем для JSON, из-за необходимости обработки бинарных данных и множества типов.
  • Отсутствие универсальности: BSON не является стандартом, подобным JSON (RFC 7159). Его спецификация тесно связана с MongoDB, и хотя существуют независимые реализации, они могут не полностью соответствовать официальной спецификации.
  • Нечитаемость: BSON не предназначен для ручного редактирования или отладки без специальных инструментов, что может усложнить разработку и тестирование.

Интересные факты

  • Несмотря на название «Binary JSON», BSON не является прямым бинарным эквивалентом JSON. Он имеет свою собственную структуру и поддерживает типы, отсутствующие в JSON.
  • В MongoDB BSON используется не только для хранения данных, но и для передачи запросов и ответов между клиентом и сервером.
  • Формат BSON был разработан с учётом требования быстрой обработки на современных процессорах, что делает его одним из самых производительных форматов сериализации для NoSQL-баз данных.

Источники

  1. Спецификация BSON (bsonspec.org)
  2. Документация MongoDB: «BSON Types»
  3. Статья «Binary JSON» в английской Википедии
  4. Книга «MongoDB: The Definitive Guide» (Kristina Chodorow, Michael Dirolf)
  5. RFC 7159 (JSON)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →