Skip to main content
QUIETLYTIC
Developer

JSON Diff

Compare two JSON documents and see what actually changed, independent of formatting.

Local · nothing leaves this browser Waiting for two documents
Esc Clear
Esc Clear
What changed

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

From the intelligence desk