#serde-json #json-diff #json #diff #serde #json-file

bin+lib serde_json_diff

Create machine-readable JSON diffs

3 unstable releases

0.2.0 Aug 13, 2023
0.1.1 Aug 12, 2023
0.1.0 Aug 12, 2023

#1136 in Encoding

Download history 477/week @ 2024-07-20 944/week @ 2024-07-27 364/week @ 2024-08-03 455/week @ 2024-08-10 559/week @ 2024-08-17 459/week @ 2024-08-24 414/week @ 2024-08-31 351/week @ 2024-09-07 449/week @ 2024-09-14 487/week @ 2024-09-21 358/week @ 2024-09-28 199/week @ 2024-10-05 202/week @ 2024-10-12 424/week @ 2024-10-19 407/week @ 2024-10-26 363/week @ 2024-11-02

1,449 downloads per month

MIT license

13KB
245 lines

Create machine-readable JSON diffs

Usage

Library

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());

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:

{
  "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"
  }
}

Dependencies

~0.7–1.8MB
~37K SLoC