Все статьи

JSON Diff: чем структурное сравнение отличается от текстового

Если сравнить два JSON-документа обычным текстовым diff (как для кода), результат часто будет обманчивым: один и тот же набор данных можно записать с разным порядком ключей, разными отступами или разным количеством пробелов — и текстовый diff покажет «разницу» там, где данные на самом деле идентичны.

Структурное сравнение

Структурный JSON Diff парсит оба документа в дерево значений и сравнивает именно данные: есть ли поле, какое значение оно содержит, совпадает ли тип. Порядок ключей объекта, лишние пробелы или стиль отступов при этом не учитываются — они не являются частью самих данных.

Что показывает диф

Типичный результат структурного сравнения выделяет три категории изменений: поля, добавленные во втором документе, поля, удалённые из первого, и поля, существующие в обоих, но с разными значениями. Для массивов сравнение сложнее — нужно решить, сравнивать элементы по позиции или пытаться сопоставить похожие объекты.

Зачем это нужно

  • Сравнить ответ API до и после изменения на бекенде, чтобы увидеть реальные изменения в данных.
  • Проверить, что изменение в конфигурационном файле не затронуло ничего лишнего.
  • Найти регрессию в тестах, где ожидаемый и фактический JSON различаются.

Диф файлов локализации в 1С-Битрикс и других российских CMS

В экосистеме, где до сих пор широко используется 1С-Битрикс, конфигурация компонентов и языковые файлы часто хранятся в JSON и синхронизируются между dev-, staging- и продакшн-окружениями вручную, через выгрузку/загрузку. Структурный diff здесь — не абстрактная опция, а способ убедиться, что «обновление конфига компонента каталога» не притащило с собой случайно изменённые лимиты пагинации или ключи API, спрятанные среди сотен визуально одинаковых строк.

Сравнение массивов: по позиции или по ключу

Самый простой подход — сравнивать элементы массива индекс-к-индексу, но если в середину массива вставили новый элемент, все последующие позиции «сдвигаются» и diff покажет изменение в каждом элементе после точки вставки, хотя реально изменился только один. Более умные инструменты пытаются сопоставить элементы по уникальному полю (например, id), чтобы показать именно вставку или удаление, а не каскад ложных изменений.

Попробовать инструмент