Инструменты
Руководства

Сравнение JSON

JSON

Сравнивает два документа JSON и подсвечивает структурные отличия.

100 % на клиенте Без бэкенда
Слева (оригинал)
Справа (изменено)
Вывод
На этой странице

Что такое сравнение JSON?#

Сравнение JSON (diff) берёт два документа JSON и точно сообщает, что между ними изменилось — какие поля появились, какие исчезли, а какие остались на том же пути, но приняли другое значение. Это структурный аналог текстового diff, но вместо совпадения строк он обходит дерево объектов и массивов, поэтому переход значения с 1 на 2 виден как точечное изменение по конкретному пути, а не как переписанный блок текста.

Это важно всегда, когда JSON — проводной формат чего-то, что эволюционирует: ответы API между развёртываниями, конфиги между ревизиями, фикстуры в тестовом наборе, экспортируемые данные за разные дни. Смотреть на два красиво напечатанных блока бок о бок работает лишь для крошечных документов; как только вложенность становится глубокой, отличия нужно перечислить.

Подвох в том, что сравнение JSON чувствительно к порядку массивов. Два массива равны, только если их элементы совпадают позиция за позицией, потому что именно так сам JSON определяет равенство. Поэтому [a, b] и [b, a] различны, и diff сообщит об этом — полезно, когда порядок значим (последовательность шагов), и неожиданно, когда нет (множество, замаскированное под массив).

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

  1. Вставьте исходный документ в панель Слева (оригинал), а изменённый — в панель Справа (изменено).
  2. Сравнение выполняется в реальном времени по мере ввода. Можно также нажать Сравнить, чтобы принудительно обновить.
  3. Область вывода отображает каждую разницу отдельной строкой:
    • Добавлено — путь существует только справа; строка показывает новое значение.
    • Удалено — путь существует только слева; строка показывает старое значение.
    • Изменено — путь есть с обеих сторон, но со значением, которое отличается; строка показывает старое → новое. Каждая строка помечена путём в стиле JSONPath, например $.version или $.tags[2], чтобы его можно было найти в любом из документов.
  4. Если оба документа полностью равны, строка состояния явно сообщает об этом — «различий нет» — вместо пустой панели, которую надо интерпретировать.
  5. Пример загружает реалистичную пару «до/после»; Очистить сбрасывает обе панели и результат.

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

  • Структурное, а не текстовое. Сравнивается разобранное дерево значений, поэтому переформатирование отступов, переупорядочивание ключей объекта или изменение пробелов никогда не дают ложного отличия.
  • Точные пути. Каждое изменение несёт своё расположение в нотации JSONPath — $ для корня, .key для полей объекта, [i] для индексов массива — поэтому можно сразу перейти в нужное место.
  • Три типа изменений. Добавлено, удалено и изменено сообщаются раздельно и с цветовой маркировкой, поэтому добавления визуально отличаются от удалений и правок.
  • Отдельная отчётность об ошибках по каждой стороне. Если один из вводов не является корректным JSON, строка состояния назовёт, какая сторона не прошла проверку («Левый ввод не является корректным JSON»), а не упадёт непонятно.
  • Живое сравнение. Diff обновляется по мере редактирования любой панели, поэтому работа с фикстурой или ответом идёт немедленно.

Разбор примера#

Загрузите Пример, и обе панели заполнятся небольшим конфигом до и после правки:

{
  "name": "ArpGate",
  "version": 1,
  "tags": ["json", "encoding"],
  "features": { "static": true, "backend": null }
}

слева, против:

{
  "name": "ArpGate",
  "version": 2,
  "tags": ["json", "encoding", "crypto"],
  "features": { "static": true, "backend": false, "offline": true }
}

справа. Diff точно перечисляет, что сдвинулось:

changed  $.version           1 → 2
added    $.tags[2]           "crypto"
changed  $.features.backend  null → false
added    $.features.offline  true

Заметьте, чего нет: $.name (без изменений), $.tags[0] и $.tags[1] (без изменений) и $.features.static (без изменений). Равные ветви не дают вывода, поэтому четыре строки diff — полная картина, хотя в обоих документах по несколько полей. Если затем задать в обеих панелях один и тот же документ, строка состояния переключится на «различий нет — вводы идентичны».

FAQ#

Почему переупорядоченный массив отображается как полностью изменённый?#

JSON-массивы упорядочены, а равенство — позиционное. [1, 2] и [2, 1] различаются по индексу 0 и индексу 1, поэтому diff сообщает о двух изменениях. Это верно для последовательностей, где порядок значим. Если ваш массив представляет множество, отсортируйте его (или нормализуйте) в обоих документах перед сравнением — иначе перестановки будут выглядеть как правки.

Замечает ли инструмент переименование ключа объекта?#

Он сообщает это как удаление плюс добавление, потому что JSON не умеет выражать «этот ключ стал тем». Переименование enabled в active отображается как removed $.enabled и added $.active — две строки, а не одно «переименование». Это честное представление того, что изменилось в данных.

Как выглядит изменение типа?#

Оно сообщается одной строкой changed. Если значение переходит со строки "36" в число 36, diff показывает "36" → 36 по этому пути — различающиеся сериализации делают смену типа видимой. То же касается null, превращающегося в false, или числа, превращающегося в объект.

Может ли инструмент сказать, какие поля не изменились?#

Нет, и намеренно. Перечисление каждого неизменного поля утопило бы реальные изменения в шуме любого настоящего документа. Diff показывает только дельты; равные ветви молчат. Если нужно увидеть полную структуру одного документа, отрендерите его просмотрщиком дерева.