JSON Diff
Compare two JSON documents key by key — added, removed, changed
Why text diffs lie about JSON
A line-based diff flags reformatted JSON as changed even when every value is identical, and buries one flipped boolean in a wall of red and green. A structural diff parses both documents first, then compares value by value — formatting noise disappears and the three real changes surface.
What this tool does
- 🆚 Diffs objects by key and arrays by index, recursively
- 🏷️ Labels every row added, removed or changed with its JSON path
- 📊 Summarizes counts up top (+2 / −1 / ~3)
- ⚡ Compares live as you type with a compare button for intent
When to use it
- Reviewing what an API actually changed between versions
- Checking config drift between staging and production
- Verifying a migration transformed data correctly
Privacy: both documents are parsed and compared locally — JSON you paste never leaves your browser.
Last updated · 2026-09-01
How the diff works
Both inputs parse to values, then a recursive walk emits rows: missing keys become added/removed, present-but-unequal values (compared by canonical JSON text) become changed, arrays align by index. Invalid JSON surfaces a clear error rather than a fake empty diff.
Why diff here?
Structure-aware, not line-aware
Objects diff by key and arrays by index at unlimited depth, so re-indented files with identical values correctly report zero differences.
Paths you can grep
Every change carries its full $.path.to.value address, ready to paste into code, tickets and jq queries.
Live with intent
Results refresh as you type for exploration, with an explicit Compare button and clear invalid-JSON errors instead of silent empty states.
Frequently asked questions
How are arrays compared?⌄
By index: element 3 compares against element 3. Reordered arrays therefore show as changes, which is honest — a structural diff cannot know you merely sorted.
How deep does it go?⌄
All the way down, recursively, with full $.store.book[0].title style paths at every level — no depth limit to hit.
What about formatting differences?⌄
Ignored by design: both sides are parsed first, so whitespace and key order never produce phantom diffs. Only real value differences are reported.
Frequently asked questions
How are arrays compared?
By index: element 3 compares against element 3. Reordered arrays therefore show as changes, which is honest — a structural diff cannot know you merely sorted.
How deep does it go?
All the way down, recursively, with full $.store.book[0].title style paths at every level — no depth limit to hit.
What about formatting differences?
Ignored by design: both sides are parsed first, so whitespace and key order never produce phantom diffs. Only real value differences are reported.