我有一个来自某个地方的serde Value,我想在反序列化之前给Value添加额外的“字段”。我正在查看文档,但我不知道如何操作。更具体地说,假设我有一个HashMap,我想把它的值合并到Value中。
Value
pub fn merge(v: &Value, fields: &HashMap<String, String>) -> Value
kcwpcxri1#
您需要提取Map(在Value::Object的情况下),复制它(因为您只接受&Value输入),更新它,并将它重新 Package 在Value::Object中,例如:
Value::Object
&Value
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),在这种情况下,它不需要返回任何东西.
fields
v
merge
Object
1条答案
按热度按时间kcwpcxri1#
您需要提取Map(在
Value::Object
的情况下),复制它(因为您只接受&Value
输入),更新它,并将它重新 Package 在Value::Object
中,例如:(on冲突,这将用
fields
的条目覆盖v
的条目)。请注意,如果
merge
按值获取参数,因为它不需要复制参数,那么merge
的效率会高得多。相反,它可以就地更新
Object
的Map(然后返回更新后的值),并按原样返回其余的值.它也可以通过可变引用获取v
,并就地更新Map(并忽略任何非Object
Value
),在这种情况下,它不需要返回任何东西.