JSON Diff
Compare two JSON documents and see what actually changed, independent of formatting.
Paste JSON in both panes above.
How it works
Two API responses a week apart are never byte-identical — key order shifts, a formatter re-indents, a timestamp moves. None of that is a change worth seeing. This walks both parsed values and reports only the paths whose value actually differs, which is what you meant by "what changed" in the first place.
Structural, not textual
Reformatting the same document — different indentation, different key order, minified versus pretty — produces no diff at all. A line-based diff over the formatted text would flag every one of those as a change, which is exactly backwards for JSON: the document is the value, not its layout.
An array is compared by position
Element 0 against element 0, element 1 against element 1, and so on. An array of unordered objects where one entry was inserted in the middle will show every entry after it as "changed" — that is a real limitation, not a bug: matching array elements by identity rather than position needs a key to match on, and a generic diff has no way to know which field is that key.
Nothing is sent anywhere
Both documents are parsed and compared in your tab. That matters here specifically because a diff is often run on two versions of something sensitive — a config, a token payload, an access-control list — precisely to see what someone changed.
Example
Changing {"role":"viewer"} to {"role":"admin"} reports one changed path:
role, from "viewer" to "admin". Adding a new key reports it as added, not
changed; removing one reports it as removed, with its last known value shown so you can see what was lost.
Frequently asked questions
Why does reformatting the same document show no diff?
Because this walks the parsed values, not the text. Two documents that differ only in key order or indentation are the same document, and a line diff over the formatted text would flag every reformatted line as changed — noise that drowns the field that actually moved.
How are array elements matched up?
By position: element 0 against element 0, and so on. An array of unordered records where one was inserted partway through will show every later entry as changed. Matching by an identifying field instead needs to know which field that is, and a generic diff has no way to guess it.
Is either document sent anywhere?
No. Both are parsed and compared in your tab. A diff is often run on two versions of something sensitive — a config, an access-control list, a token payload — specifically to see what someone changed, which is exactly the case where that matters most.
Related tools
JSON Formatter & Validator
Format, validate and measure JSON, with errors located by line and column.
LocalJSON to TypeScript
Infer a TypeScript interface from a JSON example, with optional fields worked out from an array.
LocalEnv Diff
Compare two versions of a config file line by line.
LocalGit Diff Viewer
Render git diff output as a readable, colour-coded diff.
LocalCSV Linter
Check a CSV file for ragged rows and detect its delimiter, without converting it to anything.
LocalJSON Schema Validator
Validate a JSON document against a JSON Schema and see exactly which rule failed, and where.
Local