JSON Diff / Compare
Paste two JSON documents and see exactly what changed — keys are matched regardless of order, and nested values are compared right down to the leaf.
Paste JSON into both boxes above to compare them.
How it works
This is a semantic diff, not a text diff. Both sides are parsed into real JSON, then compared structurally so only meaningful differences show up.
Paste both versions
Drop the original into A and the updated version into B. Each side is parsed and validated on its own.
Compared structurally
Objects are matched key by key regardless of order; arrays are matched index by index. The walk is recursive to any depth.
Read the diff
Every leaf is labelled added, removed, changed or unchanged, each with its full dotted path.
About semantic JSON comparison
A traditional line-based diff treats JSON as plain text, so re-indenting a file or listing an object's keys in a different order lights up as dozens of false changes. That noise makes it hard to spot the one value that actually moved.
A semantic diff sidesteps that by comparing the parsed data
instead of the text. Objects are unordered maps, so { a: 1, b: 2 }
equals { b: 2, a: 1 }. Arrays are ordered, so they're compared
position by position. The comparison is also type-aware — the number
5 and the string "5" are reported as a change, not a
match.
The result is a precise list of what was added,
removed or changed, each pinned to a dotted
path like user.roles[0] so you can jump straight to it in your
source.
Private by design. Both documents are parsed and compared entirely in your browser with plain JavaScript. Your JSON never leaves your device and is never uploaded — we never see it.
Frequently Asked Questions
How is this different from a plain text diff? ▼
Does the order of keys matter? ▼
{ a: 1, b: 2 } and { b: 2, a: 1 } are treated as identical. Arrays, however, are compared index by index, so element order does matter for lists.What do added, removed and changed mean? ▼
How are nested objects and arrays handled? ▼
user.address.city or items[2].price.Can it tell a number from a string? ▼
5 and the string "5" are reported as changed. It also distinguishes null, booleans, objects and arrays from one another.