Как изменить значение serde_json, добавив дополнительные поля?

#rust #serde

#Ржавчина #serde

Вопрос:

Итак, у меня Value откуда-то есть serde, и я хотел бы добавить дополнительные «поля» к Value нему, прежде чем десериализовать его впоследствии. Я просматриваю документы, но не вижу, как это сделать.

Более конкретно, допустим, у меня есть хэш-карта, значения которой я хочу объединить в значение.

 pub fn merge(v: amp;Value, fields: amp;HashMap<String, String>) -> Value
 

Ответ №1:

Вам нужно извлечь карту (в Value::Object случае), скопировать ее (поскольку вы принимаете только amp;Value входные данные), обновить ее и повторно обернуть в Value::Object , например

 pub fn merge(v: amp;Value, fields: amp;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(),
    }
}
 

(при конфликте это приведет к замене v записей ‘s на fields ‘s).

Комментарии:

1. И обратите внимание, что метод мог бы быть намного более эффективным, если бы он принимал аргументы по значению, поскольку ему не нужно было бы их копировать. Он мог бы обновить Object карту на месте, а мог бы просто вернуть все остальное как есть. Он также может принимать v по изменяемой ссылке и обновлять карту на месте (в этом случае он ничего не должен возвращать, или он должен возвращать изменяемую ссылку v , которую он получает в качестве входных данных).