17 releases (7 stable)

4.0.0 Feb 24, 2025
3.1.0 Feb 24, 2025
3.0.1 Oct 7, 2024
2.0.0 May 6, 2024
0.2.1 Nov 3, 2017

#51 in Rust patterns

Download history 398986/week @ 2025-01-11 328844/week @ 2025-01-18 379172/week @ 2025-01-25 413032/week @ 2025-02-01 519405/week @ 2025-02-08 490310/week @ 2025-02-15 567228/week @ 2025-02-22 601882/week @ 2025-03-01 588982/week @ 2025-03-08 559940/week @ 2025-03-15 560940/week @ 2025-03-22 528299/week @ 2025-03-29 552264/week @ 2025-04-05 484506/week @ 2025-04-12 499766/week @ 2025-04-19 366504/week @ 2025-04-26

1,999,673 downloads per month
Used in 479 crates (59 directly)

MIT/Apache

39KB
672 lines

crates.io crates.io Build Codecov

json-patch

A JSON Patch (RFC 6902) and JSON Merge Patch (RFC 7396) implementation for Rust.

Usage

Add this to your Cargo.toml:

[dependencies]
json-patch = "*"

Examples

Create and patch document using JSON Patch:

#[macro_use]
use json_patch::{Patch, patch};
use serde_json::{from_value, json};

let mut doc = json!([
    { "name": "Andrew" },
    { "name": "Maxim" }
]);

let p: Patch = from_value(json!([
  { "op": "test", "path": "/0/name", "value": "Andrew" },
  { "op": "add", "path": "/0/happy", "value": true }
])).unwrap();

patch(&mut doc, &p).unwrap();
assert_eq!(doc, json!([
  { "name": "Andrew", "happy": true },
  { "name": "Maxim" }
]));

Create and patch document using JSON Merge Patch:

#[macro_use]
use json_patch::merge;
use serde_json::json;

let mut doc = json!({
  "title": "Goodbye!",
  "author" : {
    "givenName" : "John",
    "familyName" : "Doe"
  },
  "tags":[ "example", "sample" ],
  "content": "This will be unchanged"
});

let patch = json!({
  "title": "Hello!",
  "phoneNumber": "+01-123-456-7890",
  "author": {
    "familyName": null
  },
  "tags": [ "example" ]
});

merge(&mut doc, &patch);
assert_eq!(doc, json!({
  "title": "Hello!",
  "author" : {
    "givenName" : "John"
  },
  "tags": [ "example" ],
  "content": "This will be unchanged",
  "phoneNumber": "+01-123-456-7890"
}));

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.9–2MB
~41K SLoC