JSON diff
Paste two JSON documents — changed paths appear instantly, no button, no upload.
Differences0paths added0values changed0paths removed
How to use it
- Paste the old JSON into “Original JSON” and the new one into “Changed JSON” — every added, removed or changed path appears as you type, there is no button to press.
- Key order, 1 vs 1.0, 1e0 vs 1 and \u00e9 vs é are not differences: the comparison is structural. If you need to review formatting or key order changes, use the text diff tool instead.
- Use “Copy diff” to take the full list away: each line is +, - or ~ followed by the path and the complete value, ready for a ticket or an email.
Example
Two documents
【Original】
{"order":"A-2026-001","customer":{"name":"Ada","city":"London"},"total":1299.5,"paid":false}
【Changed】
{"order":"A-2026-001","customer":{"name":"Ada","city":"Paris"},"total":1399.0,"paid":true,"coupon":"WELCOME10"}Differences
+ $.coupon "WELCOME10" ~ $.customer.city "London" → "Paris" ~ $.total 1299.5 → 1399.0 ~ $.paid false → true (+1 ~3 −0)
The 【Original】/【Changed】 lines are example headings; in real use the two documents go into the two input boxes. Only real value changes are listed: the unchanged order number and customer name are not shown, and key order is never a difference.
Rules, limits and known issues
- This is a structural diff, not a text diff: object key order is ignored; 1, 1.0 and 1e0 are the same number; "\u00e9" and "é" are the same string. Use the text diff tool if formatting changes matter to you.
- Numbers are compared as exact decimals, never through JavaScript Number: 9007199254740993 stays exact and 1e400 does not become Infinity. The list still shows the number exactly as you typed it.
- Strings are compared by their decoded value and shown in standard JSON form; duplicate keys keep the last value, as JSON.parse does, and a warning tells you how many duplicates were found.
- Arrays are ordered: insertions and deletions are aligned, so adding one item at the top is one “+” line, not a change to every following item. Moves are reported as one removal plus one addition, and there is no “ignore array order” option.
- Adding or removing a whole subtree is one path. Very long values are shown as “object · N keys” or “array · N items” on screen, while “Copy diff” always contains the complete value.
- “Copy diff” produces a plain-text change list (+ / - / ~, path, complete value), not a JSON Patch. Array insertions and deletions shift later indexes, so a naive JSON Patch would not apply.
- Paths use the $.a.b[0] form. Removed items point at their old index; added and changed items point at the new document.
- Limits: results update about 0.6 s after you stop typing above 200,000 characters combined; one document over 1,000,000 characters or nesting over 256 levels is reported as an error, never truncated. Arrays over the alignment limit are compared by index and a note says so; at most 400 change lines are rendered, but copying always gives the full list.
- No file upload, no URL loading, no JSON Schema or JSONPath query, no history and no share links. Everything runs in your browser: nothing is uploaded or stored.
- On Chinese, Japanese and Korean pages “Full-width punctuation” is on by default: punctuation outside strings is folded to ASCII, while the contents of strings are left exactly as typed.
Related developer tools
What people usually need next, once the two documents are compared.