Если сравнить два JSON-документа обычным текстовым diff (как для кода), результат часто будет обманчивым: один и тот же набор данных можно записать с разным порядком ключей, разными отступами или разным количеством пробелов — и текстовый diff покажет «разницу» там, где данные на самом деле идентичны.
Структурное сравнение
Структурный JSON Diff парсит оба документа в дерево значений и сравнивает именно данные: есть ли поле, какое значение оно содержит, совпадает ли тип. Порядок ключей объекта, лишние пробелы или стиль отступов при этом не учитываются — они не являются частью самих данных.
Что показывает диф
Типичный результат структурного сравнения выделяет три категории изменений: поля, добавленные во втором документе, поля, удалённые из первого, и поля, существующие в обоих, но с разными значениями. Для массивов сравнение сложнее — нужно решить, сравнивать элементы по позиции или пытаться сопоставить похожие объекты.
Зачем это нужно
- Сравнить ответ API до и после изменения на бекенде, чтобы увидеть реальные изменения в данных.
- Проверить, что изменение в конфигурационном файле не затронуло ничего лишнего.
- Найти регрессию в тестах, где ожидаемый и фактический JSON различаются.
Диф файлов локализации в 1С-Битрикс и других российских CMS
В экосистеме, где до сих пор широко используется 1С-Битрикс, конфигурация компонентов и языковые файлы часто хранятся в JSON и синхронизируются между dev-, staging- и продакшн-окружениями вручную, через выгрузку/загрузку. Структурный diff здесь — не абстрактная опция, а способ убедиться, что «обновление конфига компонента каталога» не притащило с собой случайно изменённые лимиты пагинации или ключи API, спрятанные среди сотен визуально одинаковых строк.
Сравнение массивов: по позиции или по ключу
Самый простой подход — сравнивать элементы массива индекс-к-индексу, но если в середину массива вставили новый элемент, все последующие позиции «сдвигаются» и diff покажет изменение в каждом элементе после точки вставки, хотя реально изменился только один. Более умные инструменты пытаются сопоставить элементы по уникальному полю (например, id), чтобы показать именно вставку или удаление, а не каскад ложных изменений.