Skip to content
TextArray
100% local

JSON diff

Compare two JSON documents structurally and see every added, removed and changed value by its path.

Input
Changed JSON
Output

JSON diff

Paste the original JSON into the first field and the changed version into the second, and the tool reports every difference by its path: + user.roles[2] = "admin" for an added value, − user.legacyId for a removed one, ~ user.name: "Anna" → "Eva" for a change. The comparison is structural, not textual — both documents are parsed and their values compared recursively, so reformatting, indentation and the order of object keys never count as differences. That is exactly what a plain text diff gets wrong about JSON.

Reach for it when two API responses should match but don't: staging against production, yesterday's payload against today's, the response before and after a deploy. It is just as useful for configuration drift — two exported config files that grew apart over time — and for debugging serialized state, where a single changed flag hides in kilobytes of nested objects.

Array elements are compared by index, so a shifted list shows up as a run of changes. When order genuinely doesn't matter — tags, permission lists — turn on "Ignore array order" and arrays are matched as multisets: only genuinely added or removed elements are reported. "Show unchanged values" additionally lists every unchanged path, which turns the output into a full annotated inventory of the document.

Both documents are parsed and compared entirely in your browser. Nothing is uploaded, so production payloads, tokens and customer data inside your JSON stay on your device.

FAQ

How is this different from a text diff?
A text diff compares lines, so reformatting or reordered keys look like changes. This tool parses both documents and compares values structurally — only real differences in the data are reported.
Does the order of object keys matter?
No. {"a":1,"b":2} and {"b":2,"a":1} are identical. Objects are compared by key, not by position.
How are arrays compared?
By index: the third element of the original is compared with the third element of the changed document. Turn on "Ignore array order" to match arrays as multisets instead, so reordering is not reported as a difference.
What do the paths in the output mean?
Dots descend into objects and brackets into arrays — user.roles[2] is the third element of the roles array inside user. Keys that aren't plain identifiers are quoted in brackets.
Is my JSON uploaded anywhere?
No. Both documents are parsed and compared entirely in your browser and never leave your device.