rust 如何通过添加附加字段来改变serde_json值?

9jyewag0  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(231)

我有一个来自某个地方的serde Value,我想在反序列化之前给Value添加额外的“字段”。我正在查看文档,但我不知道如何操作。
更具体地说,假设我有一个HashMap,我想把它的值合并到Value中。

pub fn merge(v: &Value, fields: &HashMap<String, String>) -> Value
kcwpcxri

kcwpcxri1#

您需要提取Map(在Value::Object的情况下),复制它(因为您只接受&Value输入),更新它,并将它重新 Package 在Value::Object中,例如:

pub fn merge(v: &Value, fields: &HashMap<String, String>) -> Value {
    match v {
        Value::Object(m) => {
            let mut m = m.clone();
            for (k, v) in fields {
                m.insert(k.clone(), Value::String(v.clone()));
            }
            Value::Object(m)
        }
        v => v.clone(),
    }
}

(on冲突,这将用fields的条目覆盖v的条目)。
请注意,如果merge按值获取参数,因为它不需要复制参数,那么merge的效率会高得多。
相反,它可以就地更新Object的Map(然后返回更新后的值),并按原样返回其余的值.它也可以通过可变引用获取v,并就地更新Map(并忽略任何非ObjectValue),在这种情况下,它不需要返回任何东西.

相关问题