JSON diff

Paste two JSON documents — changed paths appear instantly, no button, no upload.

How to use it

  1. 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.
  2. 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.
  3. 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.

What people usually need next, once the two documents are compared.