JSON Diff Checker

Paste both documents and the comparison updates as you go.

How it works

Both documents are walked in parallel by key path — a.b[2].c for a nested object key inside an array element. A key present on only one side is added or removed; a key present on both but holding a different value, or a genuinely different type (an object where the other side has an array, say), is changed — and a changed object/array pair is reported as one entry rather than diffed further, since once the shapes disagree there is nothing left that still corresponds. Arrays are compared by index, not by matching similar elements. Identical values produce no entry at all.

Frequently asked questions

Does this match up array elements that were only reordered?

No — arrays are compared strictly by position, index for index, not by trying to match up similar elements. Moving the same elements around in an array shows up as changes at every index that shifted, even though nothing was really added or removed. Matching moved elements is a much harder, genuinely ambiguous problem, so this tool states the limitation rather than guessing.

What does "changed" mean when the type is different, not just the value?

If a field is a string on one side and an object on the other — or an object on one side and an array on the other — that whole field is reported as one "changed" entry showing both full values, rather than diffing into the mismatched insides. Once the shapes disagree there is no meaningful correspondence left to walk deeper into.

Why does the Copy button copy plain text instead of the visual list?

The on-page list is for reading; the plain-text format (one line per diff, like ~ a.b.c: 1 → 2) is for pasting straight into a pull request description, a commit message, or a chat message, where a compact line-based summary is far more useful than HTML.