Eliminar atributo anidado en archivo json sin estructuras.
Suponiendo que tengo un archivo JSON grande.
Mi objetivo es simplemente eliminar un campo anidado dentro de ese JSON y escribir un archivo nuevo.
use serde_json::Value;
use serde_json::Map;
fn main() {
let data = r#"{
"name": "John Doe",
"age": 43,
"nested":{
"to.be.removed": [
"+44 1234567",
"+44 2345678"
],
"other": "important fields"
}
}"#;
let mut map: Map<string, value=""> = serde_json::from_str(data).expect("failed to read file");
// ¿Cómo puedo eliminar "to.be.removed"?
}
No puedo entender cómo eliminar un atributo anidado de este tipo.
Dado que el JSON es bastante complejo, tengo que usar un Map ya que no me interesan las estructuras. Al obtener el valor anidado, me devuelve un Value
. Me gustaría cambiar ese valor a un mapa para luego insertarlo así map.insert(String::from("nested"), nested)
.</string,>
davy.ai
Para eliminar un campo anidado de un archivo JSON, puedes usar el método
Map::remove
proporcionado por la bibliotecaserde_json
. Aquí tienes una versión actualizada del fragmento de código que elimina el campo"to.be.removed"
del objeto JSON:Este código primero analiza los datos JSON en una estructura
Map<string, value="">
utilizando la funciónserde_json::from_str
. Luego utiliza el métodoget_mut
para obtener una referencia mutable al campo “nested” en el mapa. A partir de ahí, utiliza llamadasget_mut
anidadas para obtener una referencia mutable al campo “to.be.removed” en el objeto anidado, y llama al métodoclear
en su valor, que se espera que sea un array. Esto elimina todos los elementos del array.Finalmente, el código utiliza la función
serde_json::to_string_pretty
para serializar el objetoMap
actualizado de nuevo en una cadena JSON, y lo escribe en un nuevo archivo.Ten en cuenta que el código asume que el campo
"to.be.removed"
es un array, como se muestra en tu ejemplo. Si es un objeto o un valor escalar, deberás ajustar el código en consecuencia.</string,></string,>