A text diff on JSON is usually unreadable, and the reason is structural. Two documents can be semantically identical and differ on every line: keys in a different order, different indentation, one minified and one formatted. A line-based tool reports all of that as change, and the single field that actually differs is buried somewhere in the noise.
A structural comparison parses both sides first and compares the resulting values. Key order stops mattering, because an object is an unordered map of keys to values by definition. Whitespace stops mattering, because it never survived parsing. What remains is the answer to the question you asked: which keys were added, which were removed, and which kept their key and changed their value.
Arrays are where structural comparison gets genuinely hard, and it is worth knowing why rather than being surprised by the result. An array is ordered, so position carries meaning, and an element inserted at the front shifts every subsequent element by one. A naive positional comparison then reports every element as changed, which is technically true and useless. Reordering an array is a real change and should be reported as one; the practical advice is to look at array diffs with the ordering question in mind rather than reading them as a list of edits.
Type changes deserve particular attention because they are the ones that break consumers silently. A field that was the number 1 and is now the string "1" looks nearly identical in a rendered diff and behaves differently in every strict language downstream. The same goes for a null replacing an absent key: both render as nothing in many viewers, and they mean different things to a parser that distinguishes them.
The common uses shape how to read the result. Comparing an API response before and after a deployment tells you what a change actually altered on the wire, which is often more than the release notes claimed. Comparing two configuration files across environments finds the one differing flag that explains why staging behaves and production does not. Comparing a fixture against live output is how a test failure gets diagnosed in seconds rather than minutes.
Both documents are parsed and compared in your browser tab. Nothing is uploaded, which matters here more than anywhere else on this site, because comparing two production payloads means holding two sets of real customer records in the page at once.