Сравнение на две JSON структури
- Табло
- Документация
- API
Защо да сравняваме два JSON?
Сравняването на две JSON структури се появява редовно в живота на програмиста. Отговор на API което се променя след актуализация. Конфигурационен файл, който се различава между две среди. А експортиране на обекти, които трябва да се подравнят спрямо препратка. JSON diff отговаря прецизно на този въпрос: какво е добавено, изтрито или променено и къде?
diff ред по ред (a la git diff) често не е достатъчен. Ако форматирането
се различава (интервали, ред на клавишите), текстовата разлика отчита стотици редове, докато структурата
данните са идентични. JSON компараторът работи върху структурата, след като бъде анализирана, което елиминира това
шум и само разкрива семантични различия.
Форматът на diff, създаден от инструмента
За всяко отклонение инструментът връща:
- a path in simplified JSONPath format, for example
$.user.address[0].city; - one type among added (added on the right), removed (present on the left only), modified (different values);
- the left value and/or the right value depending on the type.
An empty diff means that the two JSONs are structurally identical, regardless of their форматиране или ред на ключове.
Как алгоритъмът преминава през двете структури
Алгоритъмът е рекурсивен. На всяко ниво той идентифицира типа на двете сравнявани стойности:
- Ако и двата са асоциативни обекти, това отнема обединението на ключовете. За всеки ключ, той се спуска рекурсивно или маркира добавен/премахнат, ако ключът съществува само от едната страна.
- Ако и двете са подредени масиви, той сравнява позиция по позиция. А разликата в началото на таблицата може да измести всичко останало, което произвежда подробна разлика: това е a предполагаема граница на наивната структурна разлика.
- Ако типовете се различават (обект срещу масив, скаларен спрямо нула), той се маркира променен.
- Ако и двете стойности са скаларни (низ, число, булева стойност, нула), просто строгото сравнение е достатъчно.
Редът на ключовете в даден обект няма значение: {"a": 1, "b": 2} и {"b": 2, "a": 1}
създайте празен разл. Това отговаря на семантиката на JSON, където редът няма значение. в
Редът на елементите на масива обаче има значение: масивът се подрежда по конструкция.
Конкретен пример
Ето две версии на потребителски обект:
// ляво
{
"id": 42,
"име": "Алис",
"роли": ["администратор", "редактор"]
}
// правилно
{
"id": 42,
"име": "Алис Мартин",
"роли": ["администратор", "гледач"],
"активен": вярно
}
Разликата произвежда:
$.name: променено,"Алис"→"Алис Мартин"$.roles[1]: променен,"редактор"→"преглед"$.active: добавено,вярно
Случаи на употреба
- Различни среди: сравнете изхода на крайна точка в предпроизводството и в производство. Много полезно по време на миграция или опресняване на кеша.
- Одит на миграция: сравнете експортиране преди и след трансформация, за да проверите че няма загубени полета.
- Регресия на API: преди и след промяна, сравнете отговора за a идентична заявка. Празна разлика потвърждава липсата на регресия.
- Синхронизиране на конфигурацията: сравнете
composer.jsonмежду два разклонения, два файла.eslintrc, две конфигурации на Symfony. - Тестове за моментна снимка: заменете сравнението ред към ред със сравнение структурни в набор от интеграционни тестове.
Граници на структурната разлика
Сравняването на подредени масиви е известно ограничение на наивните структурни разлики. Ако вмъкнем a елемент в началото на масива, всички следващи позиции се изместват и diff сигнализира всяко отклонение като модификация. За такива случаи съществуват по-усъвършенствани алгоритми (Myers, Patience, diff по естествен ключ), но те надхвърлят обхвата на общ инструмент за сравнение.
Разликата също не казва защо е настъпила промяна: това е наблюдение. Да се анализира a регресия, това наблюдение трябва да бъде съпоставено с ангажиментите, внедряванията и параметрите на заявка.
JSON разлика срещу JSON корекция (RFC 6902)
Допълнителен формат е JSON корекция (RFC 6902). Той описва под формата на операции
(добавяне, премахване, замяна, преместване, копиране,
test), как да трансформирате един JSON документ в друг. Където нашата разлика е наблюдение
(човек), JSON Patch е рецепта (машина). Двете представяния са еквивалентни за
прости случаи, а JSON Patch е полезен за RESTful API, които приемат модификации
частично.
Често задавани въпроси
Разликата зависи ли от реда на ключовете?
Не: за JSON обект редът не е значим. Сравнителят дава същия резултат като ключовете са сортирани или не.
подробности>Как да обработваме таблици, чийто ред не е важен?
Инструментът разглежда масивите като подредени по подразбиране (това е JSON семантика). Ако лекувате набори, сортирайте двата масива по естествен ключ преди сравнение или използвайте услуга специализиран инструмент за сравнение, който отчита тази семантика.
подробности>Каква е разликата с Git diff?
Git сравнява редове от текст. Ако отстъпът или редът на ключовете се различават, Git diff е много многословен. JSON diff работи върху анализираната структура и отчита само пропуски в данните.
подробности>Приема ли се невалиден JSON?
Не: ако един от двата JSON не анализира, инструментът връща грешка. Първо потвърдете с нашия JSON валидатор.
подробности>Пример за заявка
curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
-H "Content-Type: application/json" \
-d '{"left":"...","right":"..."}'
Входна схема
| Поле | Тип | Задължително | По подразбиране |
|---|---|---|---|
left |
text | ✓ | – |
right |
text | ✓ | – |
Крайни точки
GET https://cdrn.fr/api/v1/tools- изброява всички достъпни инструментиGET https://cdrn.fr/api/v1/tools/json-diff- извлича схемата на този инструментPOST https://cdrn.fr/api/v1/tools/json-diff/execute- изпълнява този инструмент с JSON payload