Jeśli porównać dwa dokumenty JSON zwykłym diffem tekstowym (jak w przypadku kodu), wynik jest często mylący: te same dane można zapisać z różną kolejnością kluczy, różnymi wcięciami czy różną liczbą spacji — a diff tekstowy pokaże „różnicę" tam, gdzie dane są w rzeczywistości identyczne.
Porównanie strukturalne
Strukturalny JSON Diff parsuje oba dokumenty do drzewa wartości i porównuje same dane: czy pole istnieje, jaką wartość zawiera, czy zgadza się typ. Kolejność kluczy obiektu, zbędne spacje czy styl wcięć nie są przy tym brane pod uwagę — nie są częścią samych danych.
Co pokazuje diff
Typowy wynik porównania strukturalnego wyróżnia trzy kategorie zmian: pola dodane w drugim dokumencie, pola usunięte z pierwszego oraz pola istniejące w obu, ale o różnych wartościach. W przypadku tablic porównanie jest trudniejsze — trzeba zdecydować, czy porównywać elementy według pozycji, czy próbować dopasować podobne obiekty.
Do czego to potrzebne
- Porównanie odpowiedzi API przed i po zmianie na backendzie, aby zobaczyć rzeczywiste zmiany w danych.
- Sprawdzenie, czy zmiana w pliku konfiguracyjnym nie dotknęła niczego niezamierzonego.
- Znalezienie regresji w testach, gdzie oczekiwany i rzeczywisty JSON się różnią.
Dlaczego pl.json ma więcej kluczy liczby mnogiej niż en.json
Polska odmiana liczebników jest wyjątkowo rozbudowana — reguły CLDR definiują dla polskiego aż cztery kategorie liczby mnogiej (one, few, many, other), bo "1 plik", "2 pliki" i "5 plików" wymagają trzech różnych końcówek, nie licząc formy ułamkowej. Plik tłumaczenia pl.json w bibliotece takiej jak react-i18next będzie więc miał więcej kluczy dla tego samego komunikatu niż angielski en.json, który rozróżnia tylko "one" i "other". Diff strukturalny między nimi pokaże te dodatkowe klucze jako różnicę strukturalną — i to prawidłowe zachowanie, nie błąd w tłumaczeniu.
Porównywanie tablic: według pozycji czy według klucza
Najprostsze podejście to porównywanie elementów tablicy indeks po indeksie, ale jeśli w środek tablicy wstawiono nowy element, wszystkie kolejne pozycje się „przesuwają" i diff pokaże zmianę w każdym elemencie po punkcie wstawienia, choć w rzeczywistości zmienił się tylko jeden. Bardziej zaawansowane narzędzia próbują dopasować elementy według unikalnego pola (np. id), aby pokazać właśnie wstawienie lub usunięcie, a nie kaskadę fałszywych zmian.