Compare two JSON documents and instantly see what changed. Semantic comparison ignores key order — only real differences are reported. Color-coded results show added, removed, and modified fields.
Paste two JSON documents above and click Compare
Regular text-based diff tools (like the diff command, or git's default diff) compare files line by line. For JSON, that's often wrong. Two JSON documents can be byte-different but logically identical — different key order, different whitespace, different number formatting — and a text diff will mark every line as changed.
A semantic JSON diff understands the underlying data model. It parses both documents, then compares the resulting structures recursively. Key order doesn't matter because JSON objects are unordered. Whitespace doesn't matter because it's not part of the data. Only real differences — actual changes to keys or values — are reported.
This matters in real workflows: comparing API responses across versions, reviewing config changes, validating that a transformation preserved data correctly, or auditing what changed between deployments.
Our diff algorithm walks both JSON trees in parallel, classifying each difference:
Keys or array items present in the right document but not the left. Shown in green with their values.
Keys or array items present in the left document but not the right. Shown in red.
Same key in both, different values. Both old and new values are displayed so you can see what changed.
Identical values are omitted from output by default — keeps the diff scannable for big documents.
Each difference is labeled with a JSONPath-style location like $.users[2].email, making it easy to see exactly where in the structure the change occurred. Even for deeply nested data, you can navigate directly to the changed field.
{"a":1,"b":2} and {"b":2,"a":1} are reported as identical. This is what makes the comparison semantic rather than textual.{"id":"42"} is different from {"id":42}; (2) one has a trailing whitespace character or BOM that's not visible but affects parsing. Try formatting both with the JSON Formatter first to normalize.$.users[2].address.city. This makes it easy to find the change in a large document and to communicate the change to others.json-diff.diff command)?