Skip to content

JSON Diff и сравнение

Сравнивайте два JSON-файла мгновенно в браузере. Side-by-side подсветка, вывод JSON Patch (RFC 6902), игнорирование шума вроде timestamp и ID. 100% приватно, без загрузки.

Без отслеживания Работает в браузере Бесплатно
Игнорировать пути:
Расширенные настройки
Режим массива
Проверено на соответствие RFC 6902/6901 и крайние случаи: null vs отсутствует, дрейф типов, точность плавающей точки, выравнивание массива по ключу. — Команда инструментов API Go-Tools · May 4, 2026

Что такое JSON Diff?

JSON Diff — это структурное сравнение двух JSON-документов, уважающее модель данных JSON: ключи неупорядочены, типы строги, массивы могут быть упорядочены или ключевыми. В отличие от текстового diff (сравнивающего строки и считающего перестановки ключей или пробелы различиями), JSON Diff даёт семантически осмысленный результат.

Каноническая машино-читаемая форма — JSON Patch (RFC 6902): упорядоченный массив операций (add, remove, replace, move, copy, test), преобразующий один документ в другой. Пути используют JSON Pointer (RFC 6901). Близкий по теме — JSON Merge Patch (RFC 7396): проще, но не отличает «удалить ключ» от «установить null». Этот инструмент выдаёт RFC 6902.

Глубокое равенство JSON в JavaScript сложнее, чем кажется. JSON.stringify(a) === JSON.stringify(b) ломается на перестановках ключей, путается между -0 и 0 (оба сериализуются в "0"). Корректный diff должен обходить оба дерева параллельно через объединение наборов ключей, отличать null от отсутствующего через оператор «in» и решать, что значит «равно» для чисел (Object.is по умолчанию, epsilon — для допуска).

Этот инструмент работает полностью в браузере. Входы не покидают вашу машину. Безопасно для ответов API, внутренних schema и проприетарных конфигураций.

Работа с соседними инструментами JSON: форматирование через форматировщик JSON; конвертация через JSON в YAML и YAML в JSON.

// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';

// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)

// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences

// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }]

Ключевые возможности

Side-by-Side и JSON Patch

Два вида из одного diff: визуальная подсветка для просмотра, RFC 6902 patch для автоматизации.

Игнорирование шумных полей

Пресеты в один клик убирают /createdAt, /updatedAt, /*Id, /*At, requestId, traceId. Поддерживаются собственные паттерны Extended JSON Pointer.

Сопоставление массивов по ключу

Сравнение массивов объектов по полю id, а не по индексу — для K8s envs, записей package-lock и логически неупорядоченных списков.

Строгие типы по умолчанию

1 ≠ "1". null ≠ отсутствует. Ловит дрейф сериализации бэкенда сразу, как только он попадает в тестовую фикстуру.

Полностью в браузере

Входы не покидают машину. Без загрузок, без localStorage для JSON, без аналитики того, что вы вставляете.

Поделиться ссылкой, не данными

«Поделиться ссылкой» пишет в URL только конфигурацию. Ваши JSON-входы остаются локально.

Примеры

Регрессия ответа API

{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}}
{"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}}

Два изменения (name + createdAt). Добавьте /user/createdAt в «Игнорировать пути» — останется только изменение name.

Аудит конфигурации (порядок ключей)

{"a":1,"b":2,"c":3}
{"c":3,"a":1,"b":2}

Те же данные, другой порядок ключей. JSON Diff считает порядок ключей семантически нерелевантным — diff пуст.

Массив объектов (сопоставление по ключу)

[{"id":1,"qty":3},{"id":2,"qty":5}]
[{"id":2,"qty":5},{"id":1,"qty":4}]

Переключите режим массива на «Сопоставлять по ключу» с key=id. Без выравнивания все элементы выглядят изменёнными; с выравниванием — изменилось только qty у id=1.

Вывод JSON Patch (RFC 6902)

{"items":[{"id":1,"price":29.99}]}
{"items":[{"id":1,"price":24.99}]}

Переключитесь на вкладку JSON Patch, чтобы получить [{"op":"replace","path":"/items/0/price","value":24.99}], который применяется через fast-json-patch.

Как использовать

  1. 1

    Вставьте оба JSON-документа

    Вставьте оригинал (слева) и изменённый (справа) JSON. Live-diff обновляется по мере ввода; для больших входов (>200 КБ) переключается на ручную кнопку «Diff».

  2. 2

    Уберите шум

    Нажмите пресет (Timestamps / IDs / Trace) или вставьте паттерны Extended JSON Pointer в «Игнорировать пути», чтобы убрать нерелевантные поля.

  3. 3

    Выберите нужный вид

    Side-by-Side — для просмотра человеком, JSON Patch (RFC 6902) — для применимых машинами операций. Используйте «Поделиться ссылкой», чтобы отправить конфигурацию коллеге.

Типичные ловушки diff

Шум порядка ключей (симптом текстового diff)

Если diff-инструмент сообщает, что {"a":1,"b":2} и {"b":2,"a":1} различны — он делает построчный diff, а не JSON diff. Ключи JSON неупорядочены — этот инструмент игнорирует порядок автоматически.

✗ Неверно
diff a.json b.json   # text diff: 'everything changed'
✓ Верно
JSON Diff (this tool): 0 differences

Путаница null и отсутствует

{"a":null} и {} — не одно и то же. Считая их равными, можно скрыть реальные баги бэкенда.

✗ Неверно
{"a": null} == {}   # collapsed by some tools
✓ Верно
{"a": null} ≠ {}     # type-strict diff

Порядок массива без выравнивания по ключу

[{id:1},{id:2}] vs [{id:2},{id:1}] — не «два изменения» для логического множества. Sequential так и сообщит; переключитесь на «Сопоставлять по ключу».

✗ Неверно
Sequential diff: 4 modified
✓ Верно
Match by key (id): 0 differences

Дрейф типа (число vs строка)

Бэкенды иногда сериализуют ID несогласованно — 42 vs "42". Инструмент помечает это как «modified (type)», чтобы вы заметили дрейф рано.

✗ Неверно
{"id": 42} vs {"id": "42"}   # serialization bug
✓ Верно
Diff reports 'modified (type)' with both values

Точность плавающей точки

0.1 + 0.2 !== 0.3 в IEEE 754. С tolerance=0 (по умолчанию) это помечается. Поставьте tolerance в 1e-9, если подразумеваете числовое равенство.

✗ Неверно
tolerance=0:  0.30000000000000004 ≠ 0.3
✓ Верно
tolerance=1e-9: equal

Шум timestamp и UUID

createdAt, updatedAt, requestId, traceId мутируют при каждом запросе. Используйте пресеты «Игнорировать пути».

✗ Неверно
Diff: 47 modifications (45 are timestamps)
✓ Верно
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes

Типичные сценарии

Регрессия ответа API
Сравнение staging и production ответов; игнорирование timestamp и request ID, чтобы выявить только осмысленные изменения payload.
CI snapshot test failures
Вставьте actual против expected из падающего snapshot Jest/Vitest. Уберите шум и найдите реальное изменение за секунды.
Конфликты package-lock / yarn.lock
Решение merge-конфликтов через выравнивание зависимостей по name; порядок ключей и нерелевантные поля перестают быть шумом.
Аудит K8s / Helm values
Сопоставление envs, volumeMounts и ports по name. Ловит непреднамеренные изменения порядка vs реальные правки конфигурации.
Покрытие i18n переводов
Структурный diff en.json против zh.json для поиска недостающих или лишних ключей перевода без шума значений.
Просмотр Terraform / CDK plan
Сравнение plan-вывода между запусками; числовой допуск обрабатывает плавающую точку, «Игнорировать пути» убирает ARN и timestamp.

Технические детали

Соответствие RFC 6902 в выводе patch
Генерирует валидные операции JSON Patch (add/remove/replace) с путями RFC 6901. Проверено против fast-json-patch@3.x и rfc6902.
Итеративный обход
Обход с явным стеком (без рекурсии) ограничен 100 000 узлов и глубиной 64, чтобы предотвратить переполнение стека на враждебных входах.
Числовое равенство Object.is
По умолчанию числовой допуск 0 — используется Object.is, поэтому -0 и +0 различаются. Установите допуск > 0 для epsilon-равенства.

Лучшие практики

Фильтруйте до просмотра
Сначала добавьте «Игнорировать пути» (timestamp, ID, trace-поля), потом читайте diff. Просмотр шумных diff приучает глаз пропускать — и упускать — реальные изменения.
«По ключу» для логических множеств
Если массив представляет неупорядоченное множество (envs, users, dependencies), используйте «Сопоставлять по ключу». Sequential на логическом множестве почти всегда ошибочен.
Делитесь ссылкой, а не входами
Используйте «Поделиться ссылкой», чтобы отправить коллеге конфигурацию фильтра — никогда не вставляйте чувствительный JSON в общий документ. URL содержит только конфигурацию.

Часто задаваемые вопросы

Почему diff показывает изменения везде, хотя я поменял одно поле?
Три типичных причины: (1) другой порядок ключей — JSON Diff считает их эквивалентными, а текстовые diff-инструменты — нет; (2) timestamp/UUID/auto-ID, мутирующие при каждом запросе — добавьте их в «Игнорировать пути»; (3) порядок массива, когда сравнение по индексу не подходит — переключите режим массива на «Сопоставлять по ключу».
Как игнорировать timestamp и ID в JSON diff?
Используйте поле «Игнорировать пути» выше. Нажмите пресет «Timestamps» или «IDs» для одного клика — фильтрация /createdAt, /updatedAt, /*Id, /*At, /requestId. Также можно вставить свои паттерны Extended JSON Pointer — по одному в строке.
В чём разница между JSON Patch и визуальным diff?
Визуальный (side-by-side) diff — для людей: просмотр изменений глазами. JSON Patch (RFC 6902) — для машин: структурированный массив операций (add/remove/replace), который применяется через fast-json-patch или rfc6902. Тот же diff, два вывода.
Считает ли JSON diff null и отсутствующий ключ одинаковыми?
Нет. {"a":null} и {} различаются — у первого явный null, у второго ключа нет. Реальные системы реагируют на них по-разному; этот инструмент сохраняет различие.
Как сравниваются массивы — по индексу или по ключу?
По умолчанию — по индексу (Sequential). Переключите на «Сопоставлять по ключу» и укажите поле ключа (обычно id), чтобы выровнять элементы независимо от порядка. Используйте для K8s envs, записей package-lock и любых списков, которые логически — множество.
Можно ли экспортировать diff как RFC 6902 JSON Patch?
Да. Вкладка JSON Patch выдаёт валидный массив операций RFC 6902. Если заданы «Игнорировать пути», patch фильтруется (вкладка показывает «(filtered: excludes N ignored paths)») и не воспроизведёт оригиналы точно. Очистите «Игнорировать пути» для полного patch.
JSON Patch — это то же, что JSON Merge Patch (RFC 7396)?
Нет. RFC 6902 (JSON Patch) — упорядоченный массив операций: явный и обратимый. RFC 7396 (Merge Patch) — единый merge-документ: проще, но не различает удаление и установку null. JSON Diff выдаёт RFC 6902.
Как сравнить два больших JSON-файла (>10 МБ)?
Файлы больше ~5 МБ выходят за практические возможности памяти браузера. Live-режим отключается на 200 КБ; для многомегабайтных файлов используйте CLI jq или fast-json-patch в Node.
Отправляет ли инструмент мой JSON на сервер?
Нет. Всё сравнение идёт локально в браузере. Входы не пишутся на диск, в сеть, в localStorage и в параметры URL. Обновление страницы их очищает. Кнопка «Поделиться ссылкой» записывает только конфигурацию (режим массива, «Игнорировать пути») — никогда сами данные.
Почему 42 отличается от "42" в diff?
JSON Diff строг по типам: число 42 и строка "42" не равны. Это ловит дрейф сериализации бэкенда (одни endpoint возвращают числовые ID, другие — строковые) — diff помечает это как модификацию типа.
Можно ли сравнивать JSON с комментариями (JSONC) или конечными запятыми?
Стандартный JSON (RFC 8259) не допускает комментарии и конечные запятые. Инструмент использует нативный JSON.parse, отвергающий и то, и другое. Сначала уберите комментарии через форматировщик JSON.
Как сравнить вложенные массивы объектов по ключу вроде id?
Установите режим массива «Сопоставлять по ключу» и введите id. Diff выровняет элементы по значениям id. v1 применяет одно поле ключа на всех глубинах массивов; внутренние массивы без этого поля переключаются на sequential и показывают предупреждение.
Обрабатывает ли diff точность плавающей точки (0.1 + 0.2)?
Да, через числовой допуск. По умолчанию 0 с Object.is — поэтому -0 и +0 различаются. Установите допуск в небольшое epsilon (например, 1e-9), и 0.1 + 0.2 будет равно 0.3. Допуск применяется только к числовым листьям.

Похожие инструменты

Все инструменты →

Base64 декодер и кодировщик

Кодирование и форматирование

Декодирование и кодирование Base64 онлайн бесплатно. Преобразование в реальном времени с полной поддержкой UTF-8 и эмодзи. Полная приватность — работает в браузере. Без регистрации.

Форматировщик и валидатор JSON

Кодирование и форматирование

Форматирование, проверка и улучшение читаемости JSON прямо в браузере. Бесплатный онлайн-инструмент с проверкой синтаксиса, поиском ошибок, минификацией и копированием в один клик. Полная приватность.

Конвертер JSON в YAML

Кодирование и форматирование

Вставьте JSON, получите YAML мгновенно. Live-конвертация в браузере. Готово для K8s/Compose, отступ 2/4 пробела, умное экранирование. 100% приватно, без загрузки.

Генератор QR-кодов — URL, WiFi, vCard, Email, SMS, Geo

Кодирование и форматирование

Бесплатный генератор QR-кодов. Создавайте статические QR для URL, WiFi, vCard, email и SMS. Скачивание SVG и PNG. Без срока действия, без регистрации, 100% в браузере.

URL кодировщик и декодер с парсером URL

Кодирование и форматирование

Декодирование и кодирование URL в реальном времени со встроенным парсером URL. Два режима: encodeURI и encodeURIComponent. 100% приватно, данные не отправляются на сервер.

Конвертер YAML в JSON

Кодирование и форматирование

Вставьте YAML, получите JSON мгновенно. Live-конвертация в браузере. Поддержка манифестов K8s, OpenAPI, helm values. 100% приватно, без загрузки.