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.

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

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para eliminar un campo anidado de un archivo JSON, puedes usar el método Map::remove proporcionado por la biblioteca serde_json. Aquí tienes una versión actualizada del fragmento de código que elimina el campo "to.be.removed" del objeto JSON:

    use serde_json::{Value, 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("no se pudo leer el archivo");
    
        // Elimina el campo "to.be.removed" del objeto anidado
        if let Some(nested) = map.get_mut("nested") {
            if let Some(to_be_removed) = nested.get_mut("to.be.removed") {
                to_be_removed.as_array_mut().unwrap().clear();
            }
        }
    
        // Escribe el objeto JSON actualizado en un nuevo archivo
        let new_data = serde_json::to_string_pretty(&map).expect("no se pudo serializar los datos");
        std::fs::write("new_data.json", new_data).expect("no se pudo escribir el archivo");
    }
    

    Este código primero analiza los datos JSON en una estructura Map<string, value=""> utilizando la función serde_json::from_str. Luego utiliza el método get_mut para obtener una referencia mutable al campo “nested” en el mapa. A partir de ahí, utiliza llamadas get_mut anidadas para obtener una referencia mutable al campo “to.be.removed” en el objeto anidado, y llama al método clear 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 objeto Map 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,>

Comments are closed.