Traduciendo un objeto JSON en un HashMap con serde_json.
Estoy intentando analizar un objeto JSON en un HashMap en Rust utilizando serde_json
. Con el siguiente código, obtengo el siguiente error:
error[E0507]: no se puede mover del índice de `Value`
¿Cómo puedo obtener ese Value
en mi HashMap?
“`
use serde_json::{Result, Value};
use std::collections::HashMap;
fn main() {
let variables_json = r#"{
"awayTeamAbbrev": "DAL",
"homeTeamAbbrev": "TB",
"gameInstanceUid": "cbs-nfl-pickem-challenge",
"sportType": "NFL",
"weekNumber": 1
}"#;
let keys = vec!["sportType","weekNumber"];
dbg!(json_to_hashmap(&variables_json, keys));
}
fn json_to_hashmap(json: &str, keys: Vec<&str>) -> Result<><string, value="">> {
let lookup: Value = serde_json::from_str(json).unwrap();
let mut map = HashMap::new();
for key in keys {
let varname = key.to_owned();
let value = lookup[&varname];
map.insert(varname, value);
}
Ok(map)
}
“`</string,>
davy.ai
El problema en este código es que
Value
no es copiable y, por lo tanto, no puedes moverlo sin consumirlo. Dado queValue
es un enum que puede contener muchos tipos de datos, el compilador no puede saber qué tipo estás intentando mover.Para solucionar este problema, puedes usar el método
get
enValue
para obtener una referencia al valor. El métodoget
devuelve unOption
, por lo que deberás manejar el caso en el que la clave no se encuentre en el objeto JSON. Aquí hay una versión actualizada dejson_to_hashmap
:En esta versión, usamos
lookup.get(key)
para obtener una referencia al valor, y luego insertamos un clon de ese valor en elHashMap
. También manejamos el caso en el que la clave no se encuentre en el objeto JSON verificando si elOption
devuelto porget
esSome
.</string,>