Базы данных и SQL

расширенный JSONс проверкой типов

Преобразуйте строгий EJSON между Canonical и Relaxed и проверьте предупреждения о точности.

расширенный JSON

Разобрать ObjectId

Ввод EJSON

Результат JSON

Текст обрабатывается в этом браузере, без подключения к базе и отправки документа.

Вывод и интерпретация

Одно строгое значение JSON. Выражения shell, комментарии и повторные ключи запрещены.

Целые без оболочки определяются как Int32/Int64, дроби и экспоненты — как Double. Строки остаются строками.

Лимиты: 500 000 единиц UTF-16, глубина 100, 50 000 узлов и 2 000 000 символов вывода.

Ввод или параметры изменились. Повторите преобразование перед экспортом.

Формат «расширенный JSON» нужен, когда экспортированный документ содержит $oid, $date или $numberDecimal. Эти оболочки описывают значения BSON. Если просто убрать их, принимающая программа восстановит уже другие типы.

В примере есть номер последовательности за пределами безопасного диапазона JavaScript. Сравните сохранность цифр и сохранность типа: это разные свойства. Исходный текст остаётся рядом с результатом и при преобразовании не перезаписывается.

Зачем нужен расширенный JSON

Проверьте представление перед передачей документа в другую систему.

Сохранить нужные оболочки

По умолчанию расширенный JSON выводится как Canonical. Relaxed упрощает конечные числа и допустимые даты, но сохраняет оболочки ObjectId и Decimal128. Сопоставление с исходником помогает увидеть конкретные изменения.

Три строки типизированных данных: числовая оболочка раскрыта, оболочки идентификатора и десятичного значения сохранены

Не потерять цифры Int64

Long со значением 9007199254740993 записывается из точного целого. При этом показано предупреждение: программа с JavaScript Number всё ещё может округлить его при чтении. Точность текста сама по себе не гарантирует точность получателя.

Полная последовательность цифровых блоков проходит через границу документа рядом со знаком предупреждения

Выбрать представление для получателя

01

Вставить данные вместо выражения

ObjectId() и ISODate() не входят в синтаксис JSON. Сначала экспортируйте оболочки $oid и $date. Допускается документ, массив или отдельное значение.

  • Пример и очистка показывают предпросмотр замены. После применения можно один раз вернуть ввод и результат вместе.
02

Сопоставить типы в двух режимах

Canonical сохраняет явно указанные числовые типы. Relaxed удобнее читать; перед копированием проверьте предупреждения о точности.

  • Изменение режима или отступа сразу блокирует экспорт предыдущего результата.
03

Управлять моментом запуска

Автопреобразование ждёт 350 мс после последнего изменения. Выключение отменяет ожидающую задачу и показывает кнопку запуска.

  • Ctrl/Cmd + Enter тоже запускает обработку. Копирование и скачивание включают весь результат, а не только видимую часть.

Явные правила для типов и значений

Определённый набор BSON

Проверяются ObjectId, Decimal128, Int32, Int64, Double, даты, Binary, UUID, регулярные выражения, Timestamp и MinKey/MaxKey. UUID нормализуется в бинарную оболочку подтипа 04. Флаги регулярного выражения сортируются; само выражение не выполняется.

Даты за пределами JavaScript Date

Canonical хранит миллисекунды как знаковую 64-битную строку, включая значения вне диапазона Date. Relaxed использует UTC ISO только для 1970–9999 годов. Остальные даты сохраняют оболочку миллисекунд без усечения года.

Без угадывания типа строк

Целые без оболочки определяются как Int32 или Int64 по диапазону. Дробные и экспоненциальные формы становятся Double и могут округляться до двоичной точности 64 бит. JSON-строка, похожая на дату или идентификатор, остаётся строкой.

Допустимый ввод и ограничения

Строгое подмножество v2
Нет выполнения shell, исправления синтаксиса, поддержки v1, Code/Scope, DBPointer, Undefined и Symbol. Неизвестные обычные поля сохраняются; распознанная оболочка должна иметь ровно предусмотренную структуру.
Без удаления всех меток типов
Relaxed остаётся EJSON. Он не удаляет каждый ключ с долларом и не превращает Decimal128 в Number. Переключение на Canonical не позволяет достоверно восстановить тип BSON, утраченный ещё до ввода документа.
Одно значение JSON за раз
JSONL, склеенные документы, бинарный BSON, контейнеры Hex/Base64, mongodump и загрузка файлов не поддерживаются. Обрабатывайте документы отдельно или подготовьте массив. Подключения к базе и импорта коллекций нет.
Лимиты ресурсов и диапазонов
До 500 000 единиц UTF-16, 100 уровней, 50 000 узлов и 2 000 000 символов результата. Переполнение Int64, неверная календарная дата или повторный ключ останавливают всё преобразование. Частичный результат нельзя экспортировать.
Нормализация не копирует исходные байты
Пробелы и запись дат могут изменяться. Decimal128 и регулярные выражения следуют официальному механизму, числа с плавающей точкой — двоичной точности. После правки экспорт ждёт нового успешного преобразования.

Вопросы про расширенный JSON

Чем Canonical отличается от Relaxed?

Canonical отдаёт приоритет типам BSON и использует оболочки также для чисел. Relaxed упрощает конечные числа и даты в допустимом диапазоне. Оба варианта являются корректным JSON; ObjectId и Decimal128 сохраняют оболочки в обоих режимах.

Можно ли вставить вывод mongosh напрямую?

Только если он уже представляет собой строгий JSON/EJSON. ObjectId("…"), ISODate("…") и NumberLong("…") — выражения shell, которые отклоняются. Сначала экспортируйте или сериализуйте документ в Extended JSON. Вставленный код не выполняется.

Почему NumberLong представлен строкой?

Строка внутри $numberLong в Canonical защищает цифры от преждевременного округления обычным JSON-парсером. Здесь Relaxed выводит полный целочисленный литерал. Для больших значений получателю всё равно нужен парсер чисел без потерь.

Почему нельзя записать Decimal128 обычным числом?

JavaScript Number использует двоичную точность 64 бит, отличную от десятичной точности Decimal128. Строка $numberDecimal сохраняет представление и тип, поэтому оболочка остаётся даже в Relaxed.

Можно ли преобразовать весь файл mongoexport?

Только если он содержит одно значение JSON в пределах лимитов, например массив. Обычный построчный экспорт нескольких документов является JSONL и отклоняется. Обрабатывайте документы отдельно или заранее экспортируйте массив.

Нашли неожиданный результат?

Проверить типы перед сохранением

Выберите расширенный JSON, задайте нужное представление и изучите предупреждения о точности перед скачиванием результата.