JSON Diff Checker
Compare two documents and get a flat list of every difference with the path to it. Change one value, add a member, drop an array element — each shows up as its own row, so nothing hides inside a collapsed tree.
Runs entirely in your browser — your JSON is never uploaded.
How to compare two documents
- Paste the original document on the left and the updated one on the right. Either side can be a minified or an indented payload; formatting makes no difference to the result.
- Press Compare JSON. Each difference is listed with a path such as
$.items[1].quantity. - Use Ignore array order when the same values arrive in a different sequence and the sequence is not meaningful — a list of tags, for example.
- Turn Ignore key order off when member order is part of the contract, such as a payload you sign or hash.
What counts as a difference
A value is compared after parsing, not as text. That single decision explains most of the behaviour:
- Whitespace never counts. Indentation, line breaks and spacing cannot produce a difference.
- Numbers compare numerically.
1equals1.0, and1e3equals1000. - Types are respected. The string
"42"is reported as a change against the number42, with the type transition shown in the row. - A missing member differs from null. Removing a key and setting it to
nullare different states, and the list says which one happened. - Array positions are compared by index by default. Inserting an element at the front of a ten-item array reports ten changes, because every position shifted. Turn on “ignore array order” if that is not what you mean.
How to read a path
Paths start at $, the whole document. Members are joined with a dot when the key is a plain identifier, and with brackets and quotes otherwise — $["content-type"] rather than $.content-type, which would be ambiguous. Array elements always use an index: $.orders[2].items[0].sku.
The paths are a report format, not a query language, so they are copy-pasteable into a bug ticket and readable without tooling. They are close enough to JSONPath that most of the time you can paste one into a debugger and it resolves, but no evaluator is bundled here.
When key order really matters
JSON defines an object as an unordered collection of members, so a producer that reorders keys has not changed the document. Two consumers then disagree about that: code that compares data sees no change, and code that hashes bytes sees a different hash for identical data.
The second group is where signature verification, ETags and content-addressed storage live. If you are debugging a signature that stopped matching after a refactor, turn “ignore key order” off: an order-only difference is exactly the failure that does not show up in a normal comparison. The number precision guide covers the other half of the same problem, where a round trip silently rewrites the bytes.
What this page does not do
- No JSON Patch output. The result is a change list for a human, not an RFC 6902 document.
- No schema validation. Both sides have to be syntactically valid JSON; whether they match your schema is a separate question.
- No three-way merge. Two documents, not base/ours/theirs. Merging is a different tool.
- No side-by-side text alignment. The list is structural. For a character-level diff of formatted output, a text diff tool is the right instrument.
Where your data goes
Both documents are parsed and compared in this tab. Nothing is uploaded, nothing is written to a cookie or to localStorage, and no analytics event carries the content — only the fact that a page was viewed, handled by the site-wide tag. If you open the network panel you will see no request containing your JSON.