jsonvaluemerge

Linter Actions Status semantic-release

Give an interface to merge two json_serde::Value together.

Installation

Toml [dependencies] json_value_merge = "1.1"

Usage

Merge two arrays:

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut firstjsonvalue: Value = serdejson::fromstr(r#"["a","b"]"#).unwrap(); let secoundjsonvalue: Value = serdejson::fromstr(r#"["b","c"]"#).unwrap(); firstjsonvalue.merge(secoundjsonvalue); asserteq!(r#"["a","b","c"]"#, firstjsonvalue.tostring()); } ```

Merge two objects:

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut firstjsonvalue: Value = serdejson::fromstr(r#"[{"value":"a"},{"value":"b"}]"#).unwrap(); let secoundjsonvalue: Value = serdejson::fromstr(r#"[{"value":"b"},{"value":"c"}]"#).unwrap(); firstjsonvalue.merge(secoundjsonvalue); asserteq!( r#"[{"value":"a"},{"value":"b"},{"value":"b"},{"value":"c"}]"#, firstjsonvalue.tostring() ); } ```

Merge two arrays in a specifique position:

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut valuea: Value = serdejson::fromstr(r#"{"myarray":[{"a":"t"}]}"#).unwrap(); let valueb: Value = serdejson::fromstr(r#"["b","c"]"#).unwrap(); valuea.mergein("/myarray", valueb.clone()); asserteq!(r#"{"myarray":[{"a":"t"},"b","c"]}"#, valuea.to_string()); } ```

Merge two objects in a specifique position:

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut valuea: Value = serdejson::fromstr(r#"{"myarray":[{"a":"t"}]}"#).unwrap(); let valueb: Value = serdejson::fromstr(r#"{"b":"c"}"#).unwrap(); valuea.mergein("/myarray/0", valueb.clone()); asserteq!(r#"{"myarray":[{"a":"t","b":"c"}]}"#, valuea.to_string()); } ```

Build new object:

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut object: Value = Value::default(); object.mergein("/field", Value::String("value".tostring())); object.mergein("/object", Value::Object(Map::default())); object.mergein("/array/1", Value::Object(Map::default())); object.mergein("/array/2", Value::Array(Vec::default())); object.mergein("/array/", Value::String("wildcard".to_string())); object.merge_in("/root//item", Value::String("myitem".tostring())); object.mergein("///empty", Value::Null); asserteq!(r#"{"":{"":{"empty":null}},"array":[{},[],"wildcard"],"field":"value","object":{},"root":[{"item":"myitem"}]}"#, object.tostring()); } ```

Warning: If you want to build an object with key value as an number, it's not possible. The object will be an array. Actually impossible to have for one json pointer "/field/0" an object like "[{}]" or "{"0":{}}" in the same time. By default the json pointer "/field/0" will build an object like this "[{}]".

Merge an object in an array with a wrong position will generate an error.

```rust extern crate jsonvaluemerge;

use jsonvaluemerge::Merge; use serde_json::Value;

{ let mut jsonvalue: Value = serdejson::fromstr(r#"[{"array1":[{"field":"value1"}]}]"#).unwrap(); let result = jsonvalue.mergein("/otherfield", Value::String("value".to_string()));

assert!(result.is_err(), "The result should be an error because it's not possible to find or add an object in an array with a string field exept '*'");
assert_eq!(r#"[{"array1":[{"field":"value1"}]}]"#,json_value.to_string());

} ```

Useful link

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

Apache MIT