What this compares
The comparison is structural rather than textual. Two documents with the same keys in a different order are equal, and so are two documents formatted differently. A text diff would report both as changed, which is noise when what you want to know is whether the data is the same.
Every difference is reported with its full path, so a change buried four levels down reads as items[2].price rather than as a line number you then have to go and find.
Arrays are compared by position. An element inserted at the front therefore reports every later element as changed, which is correct: at index 3 the value really is different. If your arrays are unordered sets, sort them before comparing.
What counts as a change
A value is changed when the type differs, or when the value differs. The string "5" and the number 5 are a change, because a consumer of the document will treat them differently.
null and a missing key are not the same thing. A key present with a null value reports as changed against a document where the key is absent, because that distinction matters to almost every JSON consumer.