es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema en este código es que Value no es copiable y, por lo tanto, no puedes moverlo sin consumirlo. Dado que Value 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 en Value para obtener una referencia al valor. El método get devuelve un Option, 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 de json_to_hashmap:

    fn json_to_hashmap(json: &str, keys: Vec<&str>) -> Result<><string, value="">> {
        let lookup: Value = serde_json::from_str(json)?;
    
        let mut map = HashMap::new();
        for key in keys {
            if let Some(value) = lookup.get(key) {
                map.insert(key.to_owned(), value.clone());
            }
        }
    
        Ok(map)
    }
    

    En esta versión, usamos lookup.get(key) para obtener una referencia al valor, y luego insertamos un clon de ese valor en el HashMap. También manejamos el caso en el que la clave no se encuentre en el objeto JSON verificando si el Option devuelto por get es Some.</string,>

Comments are closed.