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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para leer enteros que contengan guiones bajos utilizando serde_yaml, puedes agregar una implementación de deserialización personalizada para el campo entero. Esta implementación primero deserializaría el campo como una cadena y luego eliminaría cualquier guión bajo antes de analizarlo como un entero utilizando la función parse.

    Aquí tienes un ejemplo de implementación:

    use serde::{Deserialize, Deserializer};
    use std::str::FromStr;
    
    #[derive(Deserialize)]
    struct Instrument {
        #[serde(deserialize_with = "deserialize_integer")]
        instrumento: i32,
        otro_campo: String,
    }
    
    fn deserialize_integer<'de, D>(deserializer: D) -> Result<i32, d::error="">
    where
        D: Deserializer<'de>,
    {
        let s: String = Deserialize::deserialize(deserializer)?;
        let s = s.replace("_", "");
        i32::from_str(&s).map_err(serde::de::Error::custom)
    }
    

    En esta implementación, se agrega el atributo #[serde(deserialize_with = "deserialize_integer")] al campo instrumento para indicar que debe ser deserializado utilizando la función deserialize_integer en lugar del deserializador de enteros por defecto.

    La función deserialize_integer toma un Deserializer y devuelve un Result<i32, d::error=""> donde D es el tipo del deserializador. Primero, deserializa el valor como una cadena utilizando Deserialize::deserialize. Luego, elimina cualquier guión bajo de la cadena utilizando la función replace. Por último, analiza la cadena resultante como un entero utilizando i32::from_str y devuelve el entero o un error de deserialización si el análisis falla.

    Con esta implementación, el ejemplo de YAML en la pregunta se deserializaría en un Vec<instrument> de la siguiente manera:

    “`rust
    let yaml = r#”
    – instrumento: 5_000_000
    otro_campo: esta cadena contiene un _
    – instrumento: 5_000_000
    otro_campo: esta cadena contiene un _
    “#;

    let instrumentos: Vec = serde_yaml::from_str(yaml)?;

    assert_eq!(instrumentos[0].instrumento, 5000000);
    assert_eq!(instrumentos[1].instrumento, 5000000);
    “`</i32,></i32,>

Comments are closed.