JSON Diff
Compare two JSON values semantically. Shows added, removed, and changed keys with the exact path. Free, runs in your browser.
What this does
Compares two JSON values semantically and surfaces every difference, deeply.
For each difference the diff shows:
- The exact path into the structure (e.g.,
user.address.postalCodeorroles[2]) - The kind of change: added (only on right), removed (only on left), or changed (both, but value differs)
- The left value, the right value
The comparison ignores key ordering. {"a": 1, "b": 2} and {"b": 2, "a": 1} are equal here — they’re the same JSON document.
What this is for (and why a regular text diff is not enough)
A line-based text diff treats {"a":1,"b":2} and {"b":2,"a":1} as different. It also treats {\n "a": 1\n} and {"a":1} as different (whitespace + line breaks). Neither is what you want when you’re trying to answer “did the data change?”
This tool answers the data question. Whitespace, key order, indentation — none matter.
Specific cases this helps with:
- API regression checks. “Did our API response actually change between yesterday and today?” Hit the endpoint twice, paste both, see the structural delta.
- Reviewing a config diff. Two
tsconfig.jsonorpackage.jsonversions: did dependencies actually change, or just reordering fromnpm install? - Test snapshot triage. A snapshot test failed. Was it a real change or formatting? Paste old vs new.
- Reviewing AI-generated edits. When a coding assistant rewrites a JSON file, this shows what actually changed in the data, ignoring its formatting choices.
- Migration verification. “Did the upgrade script preserve all the data?” Diff the before-upgrade dump and after-upgrade dump.
Edge cases handled correctly
- Type changes — if a field went from
"42"(string) to42(number), it’s reported as changed (since the JS values differ), not as a no-op. - Null vs missing —
{"x": null}vs{}is reported:xwas removed in the second (the key is gone), not just nulled. This matters becausenulland absent are semantically different in many APIs. - Array element addition — extending an array reports each new index as added, with the value.
- Mixed types in arrays — handled. Each index compared independently.
- Unicode keys / special characters — pass through as JSON-quoted in the path display.
Privacy
Both JSON values stay in your browser. Nothing is sent anywhere.