Přeskočit na obsah

Nástroj pro porovnání JSON - Porovnejte JSON Online Zdarma | JSON Diff

Porovnejte JSON online zdarma pomocí našeho rychlého nástroje pro porovnání JSON. Okamžitě najděte rozdíly s barevně rozlišenými výsledky. 100% bezpečné, prohlížečové porovnání JSON. Bez nutnosti registrace.

Nástroj pro porovnání JSON

Kalkulačka načítání...
📚

Dokumentace

Nástroj pro porovnání JSON, často nazývaný JSON diff nástroj, porovnává dvě hodnoty JSON (JavaScript Object Notation) a uvádí, co se mezi nimi změnilo. Vypíše každou vlastnost nebo položku pole, která byla přidána, odstraněna nebo upravena, spolu s jejím přesným umístěním v datech. Tato stránka vysvětluje, jak nástroj whiz.tools pro porovnávání JSON funguje, na praktických příkladech založených na jeho skutečné logice porovnávání.

Co je porovnávání JSON?

Porovnávání JSON je proces kontroly dvou dokumentů JSON navzájem s cílem najít rozdíly. Dokument JSON je text tvořený objekty (páry klíč–hodnota ve složených závorkách), poli (uspořádané seznamy v hranatých závorkách) a primitivními hodnotami, jako jsou řetězce, čísla, booleany a null. Jakmile tyto dokumenty přesáhnou několik řádků, je jejich porovnávání pouhým pohledem pomalé a náchylné k chybám, takže nástroj pro porovnání automaticky provede spárování a zvýrazní každou změnu.

Vývojáři tento typ porovnání používají ke kontrole odpovědí rozhraní API, sledování změn v konfiguračních souborech, ověření, že při migraci dat nedošlo ke ztrátě informací, a kontrole změn v souborech JSON ve správě verzí.

Jak nástroj porovnává dvě hodnoty JSON

Nástroj oba vstupy parsuje pomocí standardního parseru JSON a poté prochází dvě výsledné hodnoty společně, úroveň po úrovni. V každém kroku postupně pokládá tři otázky:

  1. Mají obě hodnoty různé typy (například jedna je objekt a druhá číslo), nebo je jedna null, zatímco druhá ne? Pokud ano, zaznamená na daném místě úpravu a další porovnávání do hloubky ukončí.
  2. Jsou obě hodnoty primitivní (řetězec, číslo, boolean nebo null)? Pokud ano, porovná je přímo. Za úpravu se považuje jakýkoli rozdíl, včetně změny čísla 123 na řetězec "123".
  3. Jsou obě hodnoty objekty, nebo obě pole? Pokud ano, porovná jejich obsah podle níže uvedených pravidel a rekurzivně porovnává všechny vnořené objekty a pole.

Každý rozdíl se zaznamenává s cestou, například user.address.city nebo tags[1], takže jej lze v původním dokumentu snadno najít. Členy objektů se oddělují tečkou a položky polí se uvádějí s indexem v hranatých závorkách. Rozdíl zcela na nejvyšší úrovni dokumentu, například nahrazení pole objektem, nemá uvnitř dat žádnou cestu, a proto je označen jako $. Jde o identifikátor kořene definovaný standardem JSONPath v RFC 9535, který označuje celý dokument.

Porovnávání objektů

U dvou objektů JSON nástroj shromáždí všechny klíče, které se vyskytují alespoň v jednom z objektů. U každého klíče platí:

  • Pokud klíč existuje pouze ve druhém objektu, jde o přidanou vlastnost.
  • Pokud klíč existuje pouze v prvním objektu, jde o odstraněnou vlastnost.
  • Pokud klíč existuje v obou objektech, nástroj obě hodnoty porovná rekurzivně.

Na pořadí klíčů nezáleží. Standard JSON pořadí členů objektu nedefinuje, takže {"a":1,"b":2} a {"b":2,"a":1} jsou považovány za shodné.

Porovnávání polí

Pole se porovnávají podle pozice, nikoli podle obsahu. Nástroj prochází obě pole index po indexu a porovnává hodnoty na jednotlivých pozicích až do délky delšího pole. Pokud je jedno pole kratší, přebytečné položky na konci delšího pole jsou uvedeny jako přidané nebo odstraněné.

To znamená, že nástroj se nikdy nepokouší párovat položky polí podle jejich obsahu. Nezjistí, že objekt byl „přesunut“ z indexu 1 na index 2; vidí pouze, že se hodnota na každém indexu změnila. Odstranění nebo vložení položky uprostřed pole posune všechny následující položky o jednu pozici, takže se obvykle zobrazí jako několik samostatných úprav namísto jednoho jednoznačného přidání či odstranění.

Příklad výpočtu

Příklad 1: porovnání dvou objektů

První JSON:

1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2

Druhý JSON:

1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2

Výsledek:

  • Upraveno user.address.city: "New York" → "Boston"
  • Upraveno user.address.zip: "10001" → "02108"

Příklad 2: změna pole na konci

První JSON:

1{ "tags": ["important", "urgent", "review"] }
2

Druhý JSON:

1{ "tags": ["important", "critical", "review", "documentation"] }
2

Index 0 se nezměnil, index 1 se změnil, index 2 se nezměnil a index 3 existuje pouze ve druhém poli. Výsledek:

  • Upraveno tags[1]: "urgent" → "critical"
  • Přidáno tags[3]: "documentation"

Příklad 3: odstranění položky uprostřed pole

Tento příklad ukazuje, co se stane při odstranění položky uprostřed pole, protože jde o častý zdroj nejasností.

První 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}
8

Druhý JSON, ve kterém byla odstraněna položka „Mouse“ a na konec byla přidána položka „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}
8

Člověk, který by se na to podíval, by řekl: „Mouse byla odstraněna a Monitor byl přidán.“ Protože nástroj porovnává výhradně podle indexu, nevidí situaci tímto způsobem. Porovná index 0 s indexem 0, index 1 s indexem 1 a index 2 s indexem 2, takže každé pole za odstraněnou položkou se porovnává s nesprávným objektem. Skutečným výsledkem je sedm úprav:

  • Upraveno products[0].price: 999.99 → 899.99
  • Upraveno products[1].id: 2 → 3
  • Upraveno products[1].name: "Mouse" → "Keyboard"
  • Upraveno products[1].price: 24.99 → 59.99
  • Upraveno products[2].id: 3 → 4
  • Upraveno products[2].name: "Keyboard" → "Monitor"
  • Upraveno products[2].price: 59.99 → 349.99

Chcete-li při porovnávání podobných seznamů získat přehlednější výsledek, před vložením obě pole stejným způsobem seřaďte nebo je indexujte podle stejného klíče, například zapište oba seznamy ve stejném pořadí nebo před porovnáním přiřaďte objekty podle pole s ID.

Co nástroj nedělá

  • Nepřiřazuje položky polí podle obsahu. Jak je uvedeno výše, porovnává je čistě podle pozice indexu, takže nedokáže rozpoznat, že se položka přesunula, místo aby se změnila.
  • Nezjišťuje cyklické reference. V praxi to není omezení: oba vstupy pocházejí z JSON.parse, které vždy vytvoří prostý strom a nikdy nemůže vytvořit hodnotu odkazující zpět na sebe. Cyklické reference nemohou existovat v platném textu JSON už z podstaty.
  • Nenabízí nastavení pro seřazení polí před porovnáním. Jediným způsobem, jak se vyhnout posunům indexů popsaným výše, je změnit pořadí položek ve vstupu ještě před jejich vložením.

Jak nástroj používat

  1. Vložte první dokument JSON do levého pole a druhý do pravého.
  2. Nástroj je automaticky porovná, jakmile obě pole obsahují text, nebo porovnání spusťte ručně kliknutím na tlačítko Compare.
  3. Prohlédněte si seznam výsledků. Každý řádek uvádí cestu, například user.age, a informaci, zda byla hodnota přidána, odstraněna nebo upravena, přičemž stará a nová hodnota jsou zobrazeny vedle sebe.
  4. Kliknutím na Copy zkopírujete výsledky jako prostý text.

Pokud pole obsahuje text, který není platným JSON, nástroj místo porovnání zobrazí chybu pod tímto textovým polem. Pokud jsou neplatná obě pole, zobrazí se obě chyby současně.

Často kladené otázky

Co se považuje za rozdíl mezi dvěma hodnotami JSON? Vlastnost nebo položka pole se liší, pokud existuje pouze v jednom ze dvou dokumentů nebo pokud existuje v obou, ale obsahuje jinou hodnotu či má jiný typ. Změna hodnoty z čísla 5 na řetězec "5" se považuje za úpravu, i když mohou vypadat podobně.

Záleží na pořadí položek? Záleží na kontejneru. Objekty JSON nemají definované pořadí členů, takže dva objekty se stejnými klíči a hodnotami v jiném pořadí jsou považovány za shodné. Pole jsou uspořádaná a nástroj je porovnává podle pozice indexu, takže přesunutí položky na jiné místo se hlásí jako série úprav, nikoli jako přesun.

Co znamená cesta výsledku $? Znamená to, že se změnil celý dokument, nikoli jen jeho část. K tomu dochází, když mají oba vstupy na nejvyšší úrovni různé druhy hodnot, například je na jedné straně pole a na druhé objekt nebo jsou hodnotami prostá čísla 1 a 2. $ je identifikátor kořene ze standardu JSONPath v RFC 9535.

Odesílají se moje data JSON na server? Ne. Porovnání probíhá v prohlížeči pomocí JavaScriptu. Nic se neodesílá.

Ovlivňuje výsledek formátování, například odsazení nebo minifikace? Ne. Oba vstupy se před porovnáním analyzují na hodnoty JSON, takže mezery, odsazení ani zalomení řádků nemají žádný vliv. Porovnávají se pouze skutečná data.

Může nástroj porovnávat JSON s komentáři nebo koncovými čárkami? Ne. Standardní JSON, jak je definován v RFC 8259, komentáře ani koncové čárky nepovoluje. Vstup, který je obsahuje, je odmítnut jako neplatný.

Reference

  1. IETF. „The JavaScript Object Notation (JSON) Data Interchange Format.“ RFC 8259, prosinec 2017.
  2. IETF. „JavaScript Object Notation (JSON) Patch.“ RFC 6902, duben 2013.
  3. IETF. „JSONPath: Query Expressions for JSON.“ RFC 9535, únor 2024. (Oddíl 2,2 definuje identifikátor kořene $.)
  4. Mozilla Developer Network. „JSON.parse().“