JSON-diff

Jämför två JSON-dokument och se exakt vilka fält som lagts till, tagits bort eller ändrats

JSON A (vänster / före)

JSON B (höger / efter)

JSON-diff

Jämför två JSON-dokument och se exakt vilka fält som lagts till, tagits bort eller ändrats

Funktioner

  • Strukturell diff mellan två JSON-värden — objekt, arrayer och primitiver genomgås korrekt (null behandlas som skalär, inte objekt — typeof-null-buggen är fixad)
  • Varje skillnad rapporteras som en RFC 6901 JSON Pointer-sökväg (t.ex. `/users/0/email`) så du kan navigera direkt till exakt nod i djupt nästlad data
  • Ändrade poster visar före- OCH efter-värden bredvid varandra, så det syns om 'active' flippade true→false eller om ett tal ändrades
  • Sammanfattningsräkning: tillagda, borttagna, ändrade och oförändrade löv — diff-skalan vid en blick innan du läser detaljerna per sökväg
  • Sidovis tolkningsfelrapport namnger vilken indata som misslyckades och inkluderar JavaScript-motorns parse-meddelande — du gissar inte om A eller B är felformaterad
  • Knappen Kopiera rapport ger hela diffen (sektionerna Tillagda / Borttagna / Ändrade plus oförändrad-räkning) som klartext — klistra in i kodgranskning eller commit-meddelande
  • Ladda exempel fyller båda rutorna med ett litet realistiskt exempel (användarpost med roll- och adressändringar) så förstagångsanvändare ser diffen jobba utan att skriva
  • Helt klientsida: JSON A och JSON B tolkas och jämförs i din webbläsare; inget laddas upp, och verktyget fungerar offline efter laddning

Så använder du

  1. Klistra in ditt "före"-JSON i vänster textruta (JSON A) och "efter"-JSON till höger (JSON B).
  2. Klicka Jämför. Diffen beräknas rekursivt; objekt jämförs på nyckel, arrayer på index.
  3. Läs sammanfattningsräkningen: hur många nycklar lades till, togs bort, ändrades och hur många löv matchade.
  4. Bläddra i sökvägslistorna för att se exakt vilka JSON Pointer-sökvägar som ändrades; ändrade rader visar före → efter.
  5. Klicka Kopiera rapport för att få hela diffen som klartext — användbart för granskningsanteckningar, buggrapporter eller commit-meddelanden.
  6. Använd Ladda exempel för att se ett fungerande exempel innan du klistrar in egen data.

Tips och bästa praxis

  • Kör JSON Formatter på båda sidor först om du vill att en textdiff också ska se strukturellt-lika dokument som ingen ändring.
  • För stora arrayer där ordningen spelar roll är detta verktyg precis rätt; för set, försortera på en stabil nyckel.
  • Sökvägsutmatningen är RFC 6901, så du kan ge den direkt till bibliotek som fast-json-patch för att applicera ändringar programmatiskt.
  • Klistra in rapporten i PR-beskrivningar för att visa granskare exakt vad som ändrades i en konfig- eller fixtur-JSON.
  • Om tolkningsfel pekar på en specifik kolumn inkluderar motormeddelandet ofta rad/kolumn från json5-liknande parser — här använder vi strikt JSON.parse, så rad/kolumn kommer från värden.

Vanliga frågor

Hur jämförs arrayer — på index eller på värde?

På index. Element 0 i A jämförs med element 0 i B, 1 med 1 osv. Är A längre rapporteras extra svansindex som Borttagna; är B längre är extra svansen Tillagd. Snabbt och förutsägbart, men en insättning i början av en stor array kaskaderar till många "ändrade"-poster. För ordnings-oberoende jämförelser (set av unika ID:n), sortera båda arrayer först eller förbehandla till objekt nycklade på identifieraren.

Vilken sökvägsnotation finns i resultatet?

RFC 6901 JSON Pointer: sökvägar är snedstreckseparerade tokens som går ned i JSON-trädet. `/users/0/email` betyder "email-egenskapen för element 0 i users". Nycklar med `~` escapas som `~0`, snedstreck som `~1`. Roten visas som `/`. Samma sökvägsnotation som patch-verktyg, JSON Schema instancePath och json-formatter pointer-hover.

Hur hanteras null?

null behandlas som ett lövvärde, inte objekt — även om typeof null === 'object' i JavaScript. Så {a: null} vs {a: {}} visas som ändrat istället för att rekursera in i ett tomt objekt. {a: null} vs {a: null} räknas som ett oförändrat löv, och {a: null} vs {a: 0} visas som ändrat med före=null efter=0.

Hanterar diffen nycklar med specialtecken?

Ja. Nycklar med punkter, snedstreck, hakparenteser eller tildar JSON-Pointer-escapas i sökvägsutmatningen — `~` blir `~0`, `/` blir `~1`. Så en nyckel som heter `a/b` syns som `/a~1b` i sökvägen, otvetydigt reversibel.

Varför matchar oförändrad-räkningen inte min förväntan?

Oförändrad räknas på LÖV-nivå — primitiver som är lika mellan A och B. Ett djupt nästlat objekt vars subträd är helt identiskt bidrar med en oförändrad post per löv, inte en för hela subträdet. Det gör räknaren till en riktig sanity-check: "hur många primitiva värden förblev desamma".

Vad händer om ena sidan är null eller tom?

Tom indata tolkas som null (så `{a:1}` vs tomt jämför mot null och rapporterar hela objektet som tillagt). Ett literalt `null` är ett giltigt JSON-dokument; jämföra två nulls ger noll tillagda/borttagna/ändrade och ett oförändrat. Om båda indata är tomma rapporterar diffen trivialt noll överallt.

Skickas mitt JSON någonstans?

Nej. Båda textrutorna stannar i din webbläsare; diffen körs i samma JavaScript-kontext som renderade sidan. DevTools-fliken Nätverk visar inga förfrågningar vid klick på Jämför. Verktyget fungerar offline när sidan är cachad.

Hur skiljer sig detta från en text-radvis diff?

En textdiff som `diff a.json b.json` jobbar på tecken och radbrytningar: reformatera samma data och den lyser upp. Detta är en STRUKTURELL diff: `{"a":1, "b":2}` och `{"b":2, "a":1}` är identiska (noll diff). Bryr sig inte heller om indentering, efterföljande blanksteg eller kommentarstilar. Använd en textdiff när formateringen spelar roll; denna när data spelar roll.