Усі статті

JSON Diff: чим структурне порівняння відрізняється від текстового

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

Структурне порівняння

Структурний JSON Diff парсить обидва документи в дерево значень і порівнює саме дані: чи є поле, яке значення воно містить, чи збігається тип. Порядок ключів об’єкта, зайві пробіли чи стиль відступів при цьому не враховуються — вони не є частиною самих даних.

Що показує диф

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

Навіщо це потрібно

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

Порівняння масивів: за позицією чи за ключем

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

Спробувати інструмент