tomai
Free · Developer Tools

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.

Related tools

Related tools