Narzędzie do porównywania JSON - Porównaj JSON Online Bezpłatnie | Różnice w JSON
Porównaj JSON online bezpłatnie za pomocą naszego szybkiego narzędzia do porównywania JSON. Znajdź różnice natychmiast z kolorowo oznaczonymi wynikami. 100% bezpieczne, oparte na przeglądarce narzędzie do porównywania JSON. Bez konieczności rejestracji.
Narzędzie do Porównywania JSON
Dokumentacja
Narzędzie do porównywania JSON, często nazywane narzędziem diff dla JSON, porównuje dwie wartości JSON (JavaScript Object Notation) i informuje, co się między nimi zmieniło. Wymienia każdą dodaną, usuniętą lub zmodyfikowaną właściwość albo pozycję tablicy, podając jej dokładne miejsce w danych. Ta strona wyjaśnia, jak działa narzędzie do porównywania JSON whiz.tools, na przykładach opartych na jego rzeczywistej logice porównywania.
Na czym polega porównywanie JSON?
Porównywanie JSON to proces sprawdzania dwóch dokumentów JSON względem siebie w celu znalezienia różnic. Dokument JSON to fragment tekstu złożony z obiektów (par klucz-wartość w nawiasach klamrowych), tablic (uporządkowanych list w nawiasach kwadratowych) oraz wartości prostych, takich jak ciągi znaków, liczby, wartości logiczne i null. Ręczne porównywanie takich dokumentów jest powolne i podatne na błędy, gdy przekraczają kilka wierszy, dlatego narzędzie wykonuje dopasowanie automatycznie i wyróżnia każdą zmianę.
Programiści używają tego rodzaju porównywania do sprawdzania odpowiedzi API, śledzenia zmian w plikach konfiguracyjnych, weryfikowania, czy migracja danych nie spowodowała utraty informacji, oraz przeglądania zmian w plikach JSON w systemie kontroli wersji.
Jak narzędzie porównuje dwie wartości JSON
Narzędzie parsuje oba wejścia za pomocą standardowego parsera JSON, a następnie przechodzi jednocześnie przez dwie uzyskane wartości, poziom po poziomie. Na każdym etapie zadaje kolejno trzy pytania:
- Czy typy obu wartości są różne (na przykład jedna jest obiektem, a druga liczbą) albo czy jedna z nich to
null, a druga nie? Jeśli tak, rejestruje modyfikację w tym miejscu i przerywa dalsze porównywanie. - Czy obie wartości są proste (ciąg znaków, liczba, wartość logiczna lub null)? Jeśli tak, porównuje je bezpośrednio. Każda różnica, w tym zmiana liczby
123na ciąg znaków"123", jest uznawana za modyfikację. - Czy obie wartości są obiektami albo obie są tablicami? Jeśli tak, porównuje ich zawartość zgodnie z poniższymi zasadami i rekurencyjnie przechodzi do zagnieżdżonych obiektów lub tablic.
Każda różnica jest zapisywana wraz ze ścieżką, taką jak user.address.city lub tags[1], dzięki czemu można ją łatwo znaleźć w oryginalnym dokumencie. Elementy obiektu są łączone kropką, a pozycje tablicy są oznaczane indeksem w nawiasach kwadratowych. Różnica na samym najwyższym poziomie dokumentu, na przykład zastąpienie tablicy obiektem, nie ma ścieżki wewnątrz danych, dlatego jest oznaczana jako $. To identyfikator korzenia zdefiniowany w RFC 9535, standardzie JSONPath, i oznacza cały dokument.
Porównywanie obiektów
W przypadku dwóch obiektów JSON narzędzie zbiera wszystkie klucze występujące w którymkolwiek z nich. Dla każdego klucza:
- Jeśli klucz występuje tylko w drugim obiekcie, jest to właściwość dodana.
- Jeśli klucz występuje tylko w pierwszym obiekcie, jest to właściwość usunięta.
- Jeśli klucz występuje w obu obiektach, narzędzie porównuje obie wartości rekurencyjnie.
Kolejność kluczy nie ma znaczenia. Standard JSON nie określa kolejności elementów obiektu, dlatego {"a":1,"b":2} i {"b":2,"a":1} są traktowane jako identyczne.
Porównywanie tablic
Tablice są porównywane według pozycji, a nie zawartości. Narzędzie przechodzi przez obie tablice indeks po indeksie i porównuje elementy znajdujące się pod każdym indeksem, aż do długości dłuższej tablicy. Jeśli jedna tablica jest krótsza, dodatkowe elementy na końcu dłuższej tablicy są zgłaszane jako dodane lub usunięte.
Oznacza to, że narzędzie nigdy nie próbuje dopasowywać elementów tablicy na podstawie ich zawartości. Nie rozpoznaje, że obiekt został „przeniesiony” z indeksu 1 na indeks 2; widzi tylko, że wartość pod każdym indeksem się zmieniła. Usunięcie lub wstawienie elementu w środku tablicy przesuwa wszystkie kolejne elementy o jedną pozycję, dlatego zwykle jest wykazywane jako kilka oddzielnych modyfikacji, a nie jako jedno przejrzyste dodanie lub usunięcie.
Przykład rozwiązany
Przykład 1: porównywanie dwóch obiektów
Pierwszy JSON:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2Drugi JSON:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Wynik:
- Zmodyfikowano
user.address.city:"New York"→"Boston" - Zmodyfikowano
user.address.zip:"10001"→"02108"
Przykład 2: zmiana tablicy na końcu
Pierwszy JSON:
1{ "tags": ["important", "urgent", "review"] }
2Drugi JSON:
1{ "tags": ["important", "critical", "review", "documentation"] }
2Indeks 0 jest niezmieniony, indeks 1 uległ zmianie, indeks 2 jest niezmieniony, a indeks 3 występuje tylko w drugiej tablicy. Wynik:
- Zmodyfikowano
tags[1]:"urgent"→"critical" - Dodano
tags[3]:"documentation"
Przykład 3: usunięcie elementu ze środka tablicy
Ten przykład pokazuje, co dzieje się po usunięciu elementu ze środka tablicy, ponieważ jest to częste źródło nieporozumień.
Pierwszy JSON:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 999.99 },
4 { "id": 2, "name": "Mouse", "price": 24.99 },
5 { "id": 3, "name": "Keyboard", "price": 59.99 }
6 ]
7}
8Drugi JSON, z usuniętym wpisem „Mouse” i dodanym na końcu wpisem „Monitor”:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 899.99 },
4 { "id": 3, "name": "Keyboard", "price": 59.99 },
5 { "id": 4, "name": "Monitor", "price": 349.99 }
6 ]
7}
8Osoba oglądająca taki wynik powiedziałaby: „Usunięto Mouse i dodano Monitor”. Ponieważ narzędzie porównuje elementy ściśle według indeksu, nie interpretuje tego w ten sposób. Porównuje indeks 0 z indeksem 0, indeks 1 z indeksem 1 oraz indeks 2 z indeksem 2, więc każde pole występujące po usuniętym elemencie zostaje zestawione z niewłaściwym obiektem. Rzeczywisty wynik to siedem modyfikacji:
- Zmodyfikowano
products[0].price:999.99→899.99 - Zmodyfikowano
products[1].id:2→3 - Zmodyfikowano
products[1].name:"Mouse"→"Keyboard" - Zmodyfikowano
products[1].price:24.99→59.99 - Zmodyfikowano
products[2].id:3→4 - Zmodyfikowano
products[2].name:"Keyboard"→"Monitor" - Zmodyfikowano
products[2].price:59.99→349.99
Aby uzyskać czytelniejszy wynik podczas porównywania takich list, przed wklejeniem posortuj obie tablice lub nadaj ich elementom te same klucze, na przykład zapisując każdą listę w tej samej kolejności albo dopasowując obiekty na podstawie pola identyfikatora.
Czego narzędzie nie robi
- Nie dopasowuje elementów tablic na podstawie zawartości. Jak pokazano powyżej, porównuje je wyłącznie według indeksu, dlatego nie potrafi rozpoznać, że element został przeniesiony, a nie zmieniony.
- Nie wykrywa odwołań cyklicznych. W praktyce nie jest to ograniczenie: oba dane wejściowe pochodzą z
JSON.parse, które zawsze tworzy zwykłe drzewo i nie może wygenerować wartości odwołującej się do samej siebie. Odwołania cykliczne nie mogą występować w poprawnym tekście JSON. - Nie oferuje ustawienia sortowania tablic przed porównaniem. Jedynym sposobem uniknięcia opisanego wyżej efektu przesunięcia indeksów jest uporządkowanie elementów danych wejściowych przed ich wklejeniem.
Jak korzystać z narzędzia
- Wklej pierwszy dokument JSON do lewego pola, a drugi do prawego.
- Narzędzie porówna je automatycznie, gdy oba pola będą zawierać tekst, albo kliknij przycisk Porównaj, aby uruchomić porównanie ręcznie.
- Odczytaj listę wyników. Każdy wiersz pokazuje ścieżkę, taką jak
user.age, oraz informację, czy element został dodany, usunięty lub zmodyfikowany, przy czym stare i nowe wartości są pokazane obok siebie. - Kliknij Kopiuj, aby skopiować wyniki jako zwykły tekst.
Jeśli pole zawiera tekst, który nie jest poprawnym JSON, narzędzie wyświetla pod nim błąd zamiast porównania. Gdy oba pola zawierają niepoprawne dane, oba błędy pojawiają się jednocześnie.
Często zadawane pytania
Co uznaje się za różnicę między dwiema wartościami JSON?
Właściwość lub element tablicy różni się, jeśli występuje tylko w jednym z dwóch dokumentów albo występuje w obu, lecz ma inną wartość lub inny typ. Zmiana wartości z liczby 5 na ciąg znaków "5" jest uznawana za modyfikację, nawet jeśli wartości mogą wyglądać podobnie.
Czy kolejność elementów ma znaczenie? Zależy od kontenera. Obiekty JSON nie mają określonej kolejności elementów, dlatego dwa obiekty z tymi samymi kluczami i wartościami zapisanymi w innej kolejności są traktowane jako identyczne. Tablice są uporządkowane, a narzędzie porównuje je według pozycji indeksu, więc przeniesienie elementu w inne miejsce jest zgłaszane jako seria modyfikacji, a nie jako przeniesienie.
Co oznacza ścieżka wyniku $?
Oznacza, że zmienił się cały dokument, a nie tylko jego część. Dzieje się tak, gdy dwie wartości na najwyższym poziomie mają różne typy, na przykład po jednej stronie znajduje się tablica, a po drugiej obiekt, albo zwykłe liczby 1 i 2. $ to identyfikator elementu głównego ze standardu JSONPath, określony w RFC 9535.
Czy moje dane JSON są wysyłane na serwer? Nie. Porównanie odbywa się w przeglądarce za pomocą JavaScriptu. Żadne dane nie są przesyłane.
Czy formatowanie, takie jak wcięcia lub minifikacja, wpływa na wynik? Nie. Oba dane wejściowe są przed porównaniem analizowane jako wartości JSON, dlatego białe znaki, wcięcia i podziały wierszy nie mają znaczenia. Porównywane są tylko rzeczywiste dane.
Czy narzędzie może porównywać JSON zawierający komentarze lub końcowe przecinki? Nie. Standardowy JSON, zdefiniowany w RFC 8259, nie zezwala na komentarze ani końcowe przecinki. Dane wejściowe je zawierające są odrzucane jako niepoprawne.
Piśmiennictwo
- IETF. „Format wymiany danych JavaScript Object Notation (JSON)”. RFC 8259, grudzień 2017.
- IETF. „JavaScript Object Notation (JSON) Patch”. RFC 6902, kwiecień 2013.
- IETF. „JSONPath: wyrażenia zapytań dla JSON”. RFC 9535, luty 2024. (Sekcja 2,2 definiuje identyfikator elementu głównego
$). - Mozilla Developer Network. „JSON.parse().”