Give an interface to merge two json_serde::Value together.
Toml
[dependencies]
json_value_merge = "1.1"
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());
} ```
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.