7

I need to build a json object at runtime. For now, just a simple {"key": "stringvalue"} object. But each key/val pair must be added in a loop.

This seems really simple/basic, but I didn't find any good examples or docs on it. I did finally manage to make something work, but it seems too convoluted to be the right way.

Can anyone post a working example?

danda
  • 485
  • 4
  • 13
  • please explain more, I think you could just create a hashmap or struct and serialize it. You are doing it the wrong way. – Stargateur Nov 26 '19 at 17:23

1 Answers1

16

You can do this with serde_json::Value:

use serde_json::{Map, Value};

let mut map = Map::new();

// assuming keys_vals is a Vec<(String, String)>
for (key, val) in keys_vals.into_iter() {
    map.insert(key, Value::String(val));
}

let obj = Value::Object(map);

If you need to have the object constructed and still update the map:

let mut obj = Value::Object(map);

if let Value::Object(ref mut map) = obj {
    map.insert(key, val);
}
Mac O'Brien
  • 2,407
  • 18
  • 22