Function jsonpath_lib::replace_with

source ·
pub fn replace_with<F>(
    value: Value,
    path: &str,
    fun: &mut F
) -> Result<Value, JsonPathError>
where F: FnMut(Value) -> Option<Value>,
Expand description

Select JSON properties using a jsonpath and transform the result and then replace it. via closure that implements FnMut you can transform the selected results.

extern crate jsonpath_lib as jsonpath;
#[macro_use] extern crate serde_json;

use serde_json::Value;

let json_obj = json!({
    "school": {
        "friends": [
            {"name": "친구1", "age": 20},
            {"name": "친구2", "age": 20}
        ]
    },
    "friends": [
        {"name": "친구3", "age": 30},
        {"name": "친구4"}
]});

let ret = jsonpath::replace_with(json_obj, "$..[?(@.age == 20)].age", &mut |v| {
    let age = if let Value::Number(n) = v {
        n.as_u64().unwrap() * 2
    } else {
        0
    };

    Some(json!(age))
}).unwrap();

assert_eq!(ret, json!({
    "school": {
        "friends": [
            {"name": "친구1", "age": 40},
            {"name": "친구2", "age": 40}
        ]
    },
    "friends": [
        {"name": "친구3", "age": 30},
        {"name": "친구4"}
]}));