JSON Diff и сравнение
Сравнивайте два JSON-файла мгновенно в браузере. Side-by-side подсветка, вывод JSON Patch (RFC 6902), игнорирование шума вроде timestamp и ID. 100% приватно, без загрузки.
Расширенные настройки
Что такое 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
Вставьте оба JSON-документа
Вставьте оригинал (слева) и изменённый (справа) JSON. Live-diff обновляется по мере ввода; для больших входов (>200 КБ) переключается на ручную кнопку «Diff».
- 2
Уберите шум
Нажмите пресет (Timestamps / IDs / Trace) или вставьте паттерны Extended JSON Pointer в «Игнорировать пути», чтобы убрать нерелевантные поля.
- 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 показывает изменения везде, хотя я поменял одно поле?
Как игнорировать timestamp и ID в JSON diff?
В чём разница между JSON Patch и визуальным diff?
Считает ли JSON diff null и отсутствующий ключ одинаковыми?
Как сравниваются массивы — по индексу или по ключу?
Можно ли экспортировать diff как RFC 6902 JSON Patch?
JSON Patch — это то же, что JSON Merge Patch (RFC 7396)?
Как сравнить два больших JSON-файла (>10 МБ)?
Отправляет ли инструмент мой JSON на сервер?
Почему 42 отличается от "42" в diff?
Можно ли сравнивать JSON с комментариями (JSONC) или конечными запятыми?
Как сравнить вложенные массивы объектов по ключу вроде id?
Обрабатывает ли diff точность плавающей точки (0.1 + 0.2)?
Похожие инструменты
Все инструменты →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% приватно, без загрузки.