serde_json_diff 0.1.1

Create machine-readable JSON diffs
Documentation

Create machine-readable JSON diffs

Usage

Library

# use serde_json::json;

let a = json!({
  "list": [1, 2, 3],
  "object": {"a": "b"}
});

let b = json!({
  "list": [1, 2, 3],
  "object": {"a": "b"}
});

assert!(serde_json_diff::values(a, b).is_none());

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.

CLI

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"

Example

Comparing this file:

{
  "matches": "a",
  "missing_key": "a",
  "value_difference": 1,
  "type_difference": 1,
  "length_difference": [],
  "different_elements": ["a", "a"]
}

To this file:

{
  "matches": "a",
  "extra_key": "b",
  "value_difference": 2,
  "type_difference": "1",
  "length_difference": [true],
  "different_elements": ["a", "ab"]
}

Results in this diff ([Difference] type serialised as JSON):

{
  "Object": {
    "different_elements": {
      "Value": {
        "Array": {
          "Element": {
            "1": {
              "Scalar": [
                "a",
                "ab"
              ]
            }
          }
        }
      }
    },
    "extra_key": "ExtraKey",
    "length_difference": {
      "Value": {
        "Array": {
          "Length": [
            0,
            1
          ]
        }
      }
    },
    "missing_key": "MissingKey",
    "type_difference": {
      "Value": {
        "Type": [
          "Number",
          "String"
        ]
      }
    },
    "value_difference": {
      "Value": {
        "Scalar": [
          1,
          2
        ]
      }
    }
  }
}

Admittedly, the output is not particularly human-readable or intuitive in JSON form. So I'm very open to suggestions on how this can be improved! 😇