Hoppa till innehåll

JSON Jämförelseverktyg - Jämför JSON Online Gratis | JSON Diff

Jämför JSON online gratis med vårt snabba JSON jämförelseverktyg. Hitta skillnader direkt med färgkodade resultat. 100% säkert, webbläsarbaserat JSON diff. Ingen registrering krävs.

JSON Diff Verktyg

Laddningsberäknare...
📚

Dokumentation

Ett JSON-jämförelseverktyg, ofta kallat ett JSON-diffverktyg, jämför två JSON-värden (JavaScript Object Notation) och rapporterar vad som ändrades mellan dem. Det listar varje egenskap eller arraypost som lades till, togs bort eller ändrades, tillsammans med dess exakta plats i datan. Den här sidan förklarar hur whiz.tools JSON-jämförelseverktyg fungerar, med genomarbetade exempel baserade på verktygets faktiska jämförelselogik.

Vad är JSON-jämförelse?

JSON-jämförelse är processen att kontrollera två JSON-dokument mot varandra för att hitta skillnader. Ett JSON-dokument är ett textstycke som består av objekt (nyckel-värde-par inom klammerparenteser), arrayer (ordnade listor inom hakparenteser) och primitiva värden som strängar, tal, booleska värden och null. Att jämföra två sådana dokument med blotta ögat går långsamt och leder lätt till fel när de blir längre än några rader, så ett jämförelseverktyg gör matchningen automatiskt och markerar varje ändring.

Utvecklare använder den här typen av jämförelse för att kontrollera API-svar, följa ändringar i konfigurationsfiler, verifiera att en datamigrering inte har förlorat information och granska ändringar i JSON-filer i versionshantering.

Så jämför verktyget två JSON-värden

Verktyget tolkar båda indata med en standardparser för JSON och går sedan igenom de två resulterande värdena tillsammans, en nivå i taget. Vid varje steg ställer det tre frågor, i följande ordning:

  1. Har de två värdena olika typer (till exempel är det ena ett objekt och det andra ett tal), eller är det ena null medan det andra inte är det? I så fall registreras en ändring på den platsen och den djupare jämförelsen avbryts.
  2. Är båda värdena primitiva (en sträng, ett tal, ett booleskt värde eller null)? I så fall jämförs de direkt. Alla skillnader, inklusive en ändring från talet 123 till strängen "123", räknas som en ändring.
  3. Är båda värdena objekt eller båda arrayer? I så fall jämförs deras innehåll enligt reglerna nedan, och jämförelsen fortsätter rekursivt i eventuella nästlade objekt eller arrayer.

Varje skillnad registreras med en sökväg, till exempel user.address.city eller tags[1], så att den är lätt att hitta i originaldokumentet. Objektmedlemmar sammanfogas med en punkt och arrayposter visas med sitt index inom hakparenteser. En skillnad allra högst upp i dokumentet, till exempel när en array ersätts av ett objekt, har ingen sökväg inne i datan och märks därför $. Det är rotidentifieraren som definieras av RFC 9535, JSONPath-standarden, och den står för hela dokumentet.

Jämförelse av objekt

För två JSON-objekt samlar verktyget in varje nyckel som förekommer i något av objekten. För varje nyckel gäller följande:

  • Om nyckeln bara finns i det andra objektet är den en tillagd egenskap.
  • Om nyckeln bara finns i det första objektet är den en borttagen egenskap.
  • Om nyckeln finns i båda objekten jämför verktyget de två värdena rekursivt.

Nycklarnas ordning spelar ingen roll. JSON-standarden definierar ingen ordning för objektmedlemmar, så {"a":1,"b":2} och {"b":2,"a":1} behandlas som identiska.

Jämförelse av arrayer

Arrayer jämförs efter position, inte efter innehåll. Verktyget går igenom båda arrayerna index för index och jämför det som finns på varje index, upp till längden på den längre arrayen. Om den ena arrayen är kortare rapporteras de extra posterna i slutet av den längre arrayen som tillagda eller borttagna.

Det innebär att verktyget aldrig försöker matcha arrayposter efter deras innehåll. Det upptäcker inte att ett objekt har ”flyttats” från index 1 till index 2; det ser bara att värdet på varje index har ändrats. Om en post tas bort eller infogas mitt i en array flyttas alla efterföljande poster en position, så det visas vanligtvis som flera separata ändringar i stället för som en enda tydlig tilläggs- eller borttagningsåtgärd.

Räkneexempel

Exempel 1: jämförelse av två objekt

Första JSON:

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

Andra JSON:

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

Resultat:

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

Exempel 2: en arrayändring i slutet

Första JSON:

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

Andra JSON:

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

Index 0 är oförändrat, index 1 har ändrats, index 2 är oförändrat och index 3 finns bara i den andra arrayen. Resultat:

  • Ändrad tags[1]: "urgent" → "critical"
  • Tillagd tags[3]: "documentation"

Exempel 3: ta bort en post från mitten av en array

Det här exemplet visar vad som händer när en post tas bort från mitten av en array, eftersom det är en vanlig källa till förvirring.

Första 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

Andra JSON, där posten ”Mouse” har tagits bort och posten ”Monitor” har lagts till i slutet:

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

En person som tittar på detta skulle säga ”Mouse togs bort och Monitor lades till.” Eftersom verktyget jämför strikt efter index ser det inte saken på det sättet. Det jämför index 0 med index 0, index 1 med index 1 och index 2 med index 2, så varje fält efter den borttagna posten ställs mot fel objekt. Det faktiska resultatet är sju ändringar:

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

För att få ett tydligare resultat när listor som denna jämförs bör båda arrayerna sorteras eller nycklas på samma sätt innan de klistras in, till exempel genom att skriva varje lista i samma ordning eller matcha objekt efter ett ID-fält före jämförelsen.

Vad verktyget inte gör

  • Det matchar inte arrayposter efter innehåll. Som visas ovan jämför det enbart efter indexposition och kan därför inte känna igen att en post har flyttats i stället för ändrats.
  • Det upptäcker inte cirkulära referenser. I praktiken är detta ingen begränsning: båda indata kommer från JSON.parse, som alltid bygger ett enkelt träd och aldrig kan skapa ett värde som hänvisar tillbaka till sig självt. Cirkulära referenser kan inte finnas i giltig JSON-text från början.
  • Det finns ingen inställning för att sortera arrayer före jämförelsen. Att ordna om posterna i indata innan de klistras in är det enda sättet att undvika den indexförskjutningseffekt som beskrivs ovan.

Så använder du verktyget

  1. Klistra in det första JSON-dokumentet i den vänstra rutan och det andra i den högra rutan.
  2. Verktyget jämför dem automatiskt när båda rutorna innehåller text, eller klicka på Compare för att köra jämförelsen manuellt.
  3. Läs resultatlistan. Varje rad visar en sökväg, till exempel user.age, och om den har lagts till, tagits bort eller ändrats, med de gamla och nya värdena visade sida vid sida.
  4. Klicka på Copy för att kopiera resultaten som vanlig text.

Om en ruta innehåller text som inte är giltig JSON visar verktyget ett fel under rutan i stället för en jämförelse. När båda rutorna är ogiltiga visas båda felen samtidigt.

Vanliga frågor och svar

Vad räknas som en skillnad mellan två JSON-värden? En egenskap eller arraypost är annorlunda om den bara finns i ett av de två dokumenten eller om den finns i båda men innehåller ett annat värde eller har en annan typ. Att ändra ett värde från talet 5 till strängen "5" räknas som en ändring, även om de kan se lika ut.

Spelar posternas ordning någon roll? Det beror på behållaren. JSON-objekt har ingen definierad medlemsordning, så två objekt med samma nycklar och värden i olika ordning behandlas som identiska. Arrayer är ordnade och verktyget jämför dem efter indexposition, så om en post flyttas till en annan position rapporteras det som en serie ändringar i stället för som en flytt.

Vad betyder en resultatsökväg på $? Det betyder att hela dokumentet har ändrats, inte bara en del av det. Det händer när de två indata har olika värdetyper på toppnivån, till exempel en array på den ena sidan och ett objekt på den andra, eller talen 1 och 2. $ är rotidentifieraren från RFC 9535, JSONPath-standarden.

Skickas mina JSON-data till en server? Nej. Jämförelsen körs i webbläsaren med JavaScript. Inget laddas upp.

Påverkar formatering, till exempel indrag eller minifiering, resultatet? Nej. Båda indata tolkas som JSON-värden före jämförelsen, så blanksteg, indrag och radbrytningar spelar ingen roll. Endast själva datan jämförs.

Kan verktyget jämföra JSON med kommentarer eller avslutande kommatecken? Nej. Standard-JSON, som definieras i RFC 8259, tillåter inte kommentarer eller avslutande kommatecken. Indata som innehåller sådana avvisas som ogiltiga.

Referenser

  1. IETF. ”The JavaScript Object Notation (JSON) Data Interchange Format.” RFC 8259, december 2017.
  2. IETF. ”JavaScript Object Notation (JSON) Patch.” RFC 6902, april 2013.
  3. IETF. ”JSONPath: Query Expressions for JSON.” RFC 9535, februari 2024. (Avsnitt 2,2 definierar rotidentifieraren $.)
  4. Mozilla Developer Network. ”JSON.parse().”