Spring til indhold

JSON Sammenligningsværktøj - Sammenlign JSON Online Gratis | JSON Diff

Sammenlign JSON online gratis med vores hurtige JSON sammenligningsværktøj. Find forskelle øjeblikkeligt med farvekodet resultat. 100% sikkert, browser-baseret JSON diff. Ingen tilmelding påkrævet.

JSON Diff Værktøj

Indlæsningsberegner...
📚

Dokumentation

Et JSON-sammenligningsværktøj, ofte kaldet et JSON-diffværktøj, sammenligner to JSON-værdier (JavaScript Object Notation) og rapporterer, hvad der er ændret mellem dem. Det viser alle egenskaber eller array-elementer, der er blevet tilføjet, fjernet eller ændret, sammen med deres nøjagtige placering i dataene. Denne side forklarer, hvordan whiz.tools' JSON-sammenligningsværktøj fungerer, med gennemarbejdede eksempler baseret på den faktiske sammenligningslogik.

Hvad er JSON-sammenligning?

JSON-sammenligning er processen med at kontrollere to JSON-dokumenter mod hinanden for at finde forskelle. Et JSON-dokument er et stykke tekst, der består af objekter (nøgle-værdi-par i krøllede parenteser), arrays (ordnede lister i firkantede parenteser) og primitive værdier som strenge, tal, booleske værdier og null. Det er langsomt og fejlbehæftet at sammenligne to sådanne dokumenter med det blotte øje, når de bliver længere end nogle få linjer, så et sammenligningsværktøj matcher automatisk og fremhæver hver ændring.

Udviklere bruger denne type sammenligning til at kontrollere API-svar, spore ændringer i konfigurationsfiler, bekræfte, at en datamigrering ikke har mistet oplysninger, og gennemgå ændringer i JSON-filer i versionsstyring.

Sådan sammenligner værktøjet to JSON-værdier

Værktøjet fortolker begge input med en standard-JSON-parser og gennemgår derefter de to resulterende værdier sammen, ét niveau ad gangen. Ved hvert trin stiller det tre spørgsmål i denne rækkefølge:

  1. Har de to værdier forskellige typer (for eksempel er den ene et objekt, mens den anden er et tal), eller er den ene null, mens den anden ikke er det? I så fald registrerer det en ændring på dette sted og stopper den dybere sammenligning.
  2. Er begge værdier primitive (en streng, et tal, en boolesk værdi eller null)? I så fald sammenligner det dem direkte. Enhver forskel, herunder en ændring fra tallet 123 til strengen "123", tæller som en ændring.
  3. Er begge værdier objekter eller begge arrays? I så fald sammenligner det deres indhold efter reglerne nedenfor og går rekursivt ind i indlejrede objekter eller arrays.

Alle forskelle registreres med en sti, f.eks. user.address.city eller tags[1], så de er nemme at finde i det oprindelige dokument. Objektmedlemmer forbindes med et punktum, og array-elementer vises med deres indeks i firkantede parenteser. En forskel helt øverst i dokumentet, f.eks. et array erstattet af et objekt, har ingen sti inde i dataene og mærkes derfor $. Det er rodidentifikatoren, der er defineret af RFC 9535, JSONPath-standarden, og den står for hele dokumentet.

Sammenligning af objekter

For to JSON-objekter samler værktøjet alle nøgler, der findes i mindst ét af objekterne. For hver nøgle:

  • Hvis nøglen kun findes i det andet objekt, er det en tilføjet egenskab.
  • Hvis nøglen kun findes i det første objekt, er det en fjernet egenskab.
  • Hvis nøglen findes i begge, sammenligner værktøjet de to værdier rekursivt.

Rækkefølgen af nøgler er uden betydning. JSON-standarden definerer ikke en rækkefølge for objektmedlemmer, så {"a":1,"b":2} og {"b":2,"a":1} behandles som identiske.

Sammenligning af arrays

Arrays sammenlignes efter position, ikke efter indhold. Værktøjet gennemgår begge arrays indeks for indeks og sammenligner det, der står på hvert indeks, op til længden af det længste array. Hvis det ene array er kortere, rapporteres de ekstra elementer i slutningen af det længste array som tilføjede eller fjernede.

Det betyder, at værktøjet aldrig forsøger at matche array-elementer efter deres indhold. Det opdager ikke, at et objekt er blevet "flyttet" fra indeks 1 til indeks 2; det ser kun, at værdien på hvert indeks er ændret. Hvis et element slettes eller indsættes midt i et array, forskydes alle efterfølgende elementer én position, så det normalt vises som flere separate ændringer i stedet for én tydelig tilføjelse eller fjernelse.

Regneeksempel

Eksempel 1: sammenligning af to objekter

Første JSON:

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

Anden JSON:

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

Resultat:

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

Eksempel 2: en ændring i slutningen af et array

Første JSON:

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

Anden JSON:

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

Indeks 0 er uændret, indeks 1 er ændret, indeks 2 er uændret, og indeks 3 findes kun i det andet array. Resultat:

  • Ændret tags[1]: "urgent" → "critical"
  • Tilføjet tags[3]: "documentation"

Eksempel 3: fjernelse af et element midt i et array

Dette eksempel viser, hvad der sker, når et element fjernes fra midten af et array, fordi det er en almindelig kilde til forvirring.

Første 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

Anden JSON, hvor posten "Mouse" er slettet, og posten "Monitor" er tilføjet i slutningen:

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, der ser dette, ville sige: "Mouse blev fjernet, og Monitor blev tilføjet." Fordi værktøjet udelukkende sammenligner efter indeks, ser det ikke situationen sådan. Det sammenligner indeks 0 med indeks 0, indeks 1 med indeks 1 og indeks 2 med indeks 2, så hvert felt efter det slettede element sammenlignes med det forkerte objekt. Det faktiske resultat er syv ændringer:

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

For at få et mere overskueligt resultat ved sammenligning af lister som denne skal begge arrays sorteres eller organiseres efter nøgler på samme måde, før de indsættes, f.eks. ved at skrive hver liste i samme rækkefølge eller matche objekter efter et ID-felt før sammenligningen.

Hvad værktøjet ikke gør

  • Det matcher ikke array-elementer efter indhold. Som vist ovenfor sammenligner det udelukkende efter indeksposition, så det kan ikke genkende, at et element er flyttet i stedet for ændret.
  • Det registrerer ikke cirkulære referencer. Dette er ikke en praktisk begrænsning: Begge input kommer fra JSON.parse, som altid opbygger et almindeligt træ og aldrig kan frembringe en værdi, der henviser tilbage til sig selv. Cirkulære referencer kan slet ikke findes i gyldig JSON-tekst.
  • Det har ingen indstilling til at sortere arrays før sammenligning. Den eneste måde at undgå den indeksforskydning, der er beskrevet ovenfor, er at omarrangere elementerne i inputtet, før de indsættes.

Sådan bruges værktøjet

  1. Indsæt det første JSON-dokument i feltet til venstre og det andet i feltet til højre.
  2. Værktøjet sammenligner dem automatisk, når begge felter indeholder tekst, eller klik på Compare for at køre sammenligningen manuelt.
  3. Læs resultatlisten. Hver linje viser en sti, f.eks. user.age, og om den blev tilføjet, fjernet eller ændret, med de gamle og nye værdier vist side om side.
  4. Klik på Copy for at kopiere resultaterne som almindelig tekst.

Hvis et felt indeholder tekst, der ikke er gyldig JSON, viser værktøjet en fejl under feltet i stedet for en sammenligning. Når begge felter er ugyldige, vises begge fejl samtidig.

Ofte stillede spørgsmål

Hvad tæller som en forskel mellem to JSON-værdier? En egenskab eller et array-element er forskelligt, hvis det kun findes i ét af de to dokumenter, eller hvis det findes i begge, men indeholder en anden værdi eller har en anden type. En ændring fra tallet 5 til strengen "5" tæller som en ændring, selv om de kan se ens ud.

Har rækkefølgen af elementer betydning? Det afhænger af beholderen. JSON-objekter har ingen defineret rækkefølge for medlemmer, så to objekter med de samme nøgler og værdier i en anden rækkefølge behandles som identiske. Arrays er ordnede, og værktøjet sammenligner dem efter indeksposition, så et element, der flyttes til en anden position, rapporteres som en række ændringer og ikke som en flytning.

Hvad betyder en resultatsti på $? Det betyder, at hele dokumentet er ændret, ikke kun en del af det. Det sker, når de to input har forskellige værdityper på øverste niveau, f.eks. et array i den ene side og et objekt i den anden eller de almindelige tal 1 og 2. $ er rodidentifikatoren fra RFC 9535, JSONPath-standarden.

Sendes mine JSON-data til en server? Nej. Sammenligningen kører i browseren ved hjælp af JavaScript. Intet uploades.

Påvirker formatering, f.eks. indrykning eller minimering, resultatet? Nej. Begge input fortolkes som JSON-værdier før sammenligningen, så mellemrum, indrykning og linjeskift gør ingen forskel. Kun de faktiske data sammenlignes.

Kan værktøjet sammenligne JSON med kommentarer eller afsluttende kommaer? Nej. Standard-JSON, som defineret i RFC 8259, tillader ikke kommentarer eller afsluttende kommaer. Input, der indeholder dem, afvises som ugyldigt.

Referencer

  1. IETF. "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, februar 2024. (Afsnit 2,2 definerer rodidentifikatoren $.)
  4. Mozillas udviklernetværk. "JSON.parse()."