Lee yaml donde los números enteros contienen guiones bajos en Rust.
Me gustaría poder leer enteros que contengan guiones bajos (un separador de miles)
- instrumento: 5_000_000
otro_campo: esta cadena contiene un _
- instrumento: 5_000_000
otro_campo: esta cadena contiene un _
¿Cómo es posible esto usando serde_yaml?
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:
En esta implementación, se agrega el atributo
#[serde(deserialize_with = "deserialize_integer")]
al campoinstrumento
para indicar que debe ser deserializado utilizando la funcióndeserialize_integer
en lugar del deserializador de enteros por defecto.La función
deserialize_integer
toma unDeserializer
y devuelve unResult<i32, d::error="">
dondeD
es el tipo del deserializador. Primero, deserializa el valor como una cadena utilizandoDeserialize::deserialize
. Luego, elimina cualquier guión bajo de la cadena utilizando la funciónreplace
. Por último, analiza la cadena resultante como un entero utilizandoi32::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,>