Create machine-readable JSON diffs
let a = serde_json::json!({
"list": [1, 2, 3],
"object": {"a": "b"}
});
let b = serde_json::json!({
"list": [1, 2, 3],
"object": {"a": "b"}
});
assert!(serde_json_diff::values(a, b).is_none());
โ ๏ธ WarningThe above example is just for simplicity's sake. This library allows you to extract the difference between two
serde_json::Value
in detail.If all you need is to check for equivalence, it's possible to just do an equality check:
==
serde_json_diff::objects
and serde_json_diff::arrays
are also exposed
specifically for comparing serde_json::Map<String, serde_json::Value>
and Vec<serde_json::Value>
s respectively.
serde_json_diff my_json_file.json my_other_json_file.json
Tip: Since the command name serde_json_diff
is a bit long, I personally have it aliased in my shell config:
alias jdiff="serde_json_diff"
Comparing this file:
{
"A": "a",
"B": "a",
"D": 1,
"E": 1,
"F": [],
"G": ["a", "a"]
}
To this file:
{
"A": "a",
"C": "b",
"D": 2,
"E": "1",
"F": [true],
"G": ["a", "ab"]
}
Results in this diff (serialised as JSON):
{
"B": {
"entry_difference": "extra"
},
"D": {
"entry_difference": "value",
"value_diff": {
"difference_of": "scalar",
"source": 1,
"target": 2
}
},
"E": {
"entry_difference": "value",
"value_diff": {
"difference_of": "type",
"source_type": "number",
"target_type": "string",
"target_value": "1"
}
},
"F": {
"entry_difference": "value",
"value_diff": {
"difference_of": "array",
"array_difference": "longer",
"different_pairs": null,
"missing_elements": 1
}
},
"G": {
"entry_difference": "value",
"value_diff": {
"difference_of": "array",
"array_difference": "pairs_only",
"different_pairs": {
"1": {
"difference_of": "scalar",
"source": "a",
"target": "ab"
}
}
}
},
"C": {
"entry_difference": "missing",
"value": "b"
}
}