Сравнение JSON

Вставьте два JSON-документа — изменённые пути появятся сразу, без кнопок и без загрузки.

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

  1. Вставьте старый JSON в «Исходный JSON», а новый — в «Изменённый JSON»: каждый добавленный, удалённый или изменённый путь появляется по мере ввода, нажимать ничего не нужно.
  2. Порядок ключей, 1 и 1.0, 1e0 и 1, \u00e9 и é не считаются различиями: сравнение структурное. Если нужно проверить форматирование или порядок ключей, используйте инструмент сравнения текстов.
  3. Кнопка «Копировать diff» заберёт полный список: каждая строка начинается с +, - или ~, затем идёт путь и полное значение — готово для задачи или письма.

Пример

Два документа

【Исходный】
{"order":"A-2026-001","customer":{"name":"Ада","city":"Москва"},"total":1299.5,"paid":false}

【Изменённый】
{"order":"A-2026-001","customer":{"name":"Ада","city":"Париж"},"total":1399.0,"paid":true,"coupon":"WELCOME10"}

Различия

+ $.coupon "WELCOME10"
~ $.customer.city "Москва" → "Париж"
~ $.total 1299.5 → 1399.0
~ $.paid false → true
(+1 ~3 −0)

Строки 【Исходный】/【Изменённый】 — заголовки примера; в реальной работе два документа вставляются в два поля. Показаны только реальные изменения значений: неизменные номер заказа и имя клиента не выводятся, а порядок ключей никогда не считается различием.

Правила, ограничения и известные проблемы

  • Это структурный diff, а не текстовый: порядок ключей объекта игнорируется; 1, 1.0 и 1e0 — одно и то же число; "\u00e9" и "é" — одна и та же строка. Если изменения форматирования важны, используйте инструмент сравнения текстов.
  • Числа сравниваются как точные десятичные значения, никогда через JavaScript Number: 9007199254740993 остаётся точным, а 1e400 не превращается в Infinity. В списке число всё равно показывается ровно так, как вы его набрали.
  • Строки сравниваются по декодированному значению и показываются в стандартной форме JSON; дубликаты ключей сохраняют последнее значение, как JSON.parse, а предупреждение сообщает, сколько дубликатов найдено.
  • Массивы упорядочены: вставки и удаления выравниваются, поэтому добавление одного элемента в начало — это одна строка «+», а не изменение всех последующих. Перемещения показываются как удаление плюс добавление, опции «игнорировать порядок массива» нет.
  • Добавление или удаление целого поддерева — это один путь. Очень длинные значения на экране показываются как «объект · N ключей» или «массив · N элементов», а «Копировать diff» всегда содержит полное значение.
  • «Копировать diff» выдаёт простой текстовый список изменений (+ / - / ~, путь, полное значение), а не JSON Patch. Вставки и удаления в массивах сдвигают последующие индексы, поэтому наивный JSON Patch не применился бы.
  • Пути используют форму $.a.b[0]. Удалённые элементы указывают на старый индекс; добавленные и изменённые — на новый документ.
  • Ограничения: при суммарном объёме свыше 200 000 символов результат обновляется примерно через 0,6 с после того, как вы закончите ввод; документ больше 1 000 000 символов или вложенность глубже 256 уровней дают ошибку, а не обрезанный результат. Массивы сверх лимита выравнивания сравниваются по индексу, о чём сообщается; отрисовывается не более 400 строк изменений, но копирование всегда даёт полный список.
  • Нет загрузки файлов, подгрузки по URL, запросов JSON Schema или JSONPath, истории и ссылок для совместного доступа. Всё выполняется в браузере: ничего не загружается и не сохраняется.
  • На китайских, японских и корейских страницах «Полноширинная пунктуация» включена по умолчанию: знаки вне строк приводятся к ASCII, а содержимое строк остаётся ровно таким, как набрано.

Что обычно нужно дальше, когда два документа сравнены.