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.

Analizar matriz JSON anidada de un archivo.

Tengo un archivo json llamado sample.json que contiene un array json de la siguiente manera:

[
{
  "time": "2021-01-04T00:11:32.362Z",
  "extra_data": {
    "id": "123"
  },
  "info": "evento123"
},
{
  "time": "2021-01-05T00:11:32.362Z",
  "extra_data": {
    "id": "456"
  },
  "info": "evento456"
},
{
  "time": "2021-01-06T00:11:32.362Z",
  "extra_data": {
    "id": "789"
  },
  "info": "evento789"
}
]

Estoy intentando deserializar este array json para que, para cada objeto json (es decir, evento), pueda acceder a los valores id e info. Esto es lo que tengo hasta ahora:

func main() {

    file, err := ioutil.ReadFile("/Users/janedoe/Downloads/sample.json")
    var events Event
    json.Unmarshal([]byte(file), &events)
    fmt.Println(reflect.TypeOf(events))
    // Reading each value by its key for each event
    fmt.Println("Evento123_Tiempo:", events.Timestamp,
            "\nEvento123_ExtraData_Id:", events.ExtraData.Id,
            "\nEvento123_Info:", events.Info)
} 

type Event struct {
    Time string `json:"time"`
    ExtraData ExtraData `json:"extra_data"`
    Info string `json:"info"`
}

type ExtraData struct {
    Id string   `json:"id"`
}

La salida que estoy obteniendo es:

main.Event
Evento123_Tiempo:  
Evento123_ExtraData_Id: 
Evento123_Info: 

No estoy obteniendo ningún valor, lo que indica que el deserializado no está sucediendo como se espera. ¿Cómo puedo solucionarlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema es que estás intentando deserializar una matriz JSON en una única instancia de la estructura Event en lugar de una matriz de estructuras Event. Para solucionar esto, debes cambiar la variable events a una matriz de estructuras Event:

    var events []Event
    

    Luego, puedes iterar sobre la matriz y acceder a los valores id e info para cada evento:

    for _, event := range events {
        fmt.Println("Id del Evento :", event.ExtraData.Id, "\nInformación del Evento :", event.Info)
    }
    

    El código completo con los cambios necesarios es:

    func main() {
        archivo, err := ioutil.ReadFile("/Users/janedoe/Downloads/sample.json")
        if err != nil {
            log.Fatal(err)
        }
        var events []Event
        err = json.Unmarshal([]byte(archivo), &events)
        if err != nil {
            log.Fatal(err)
        }
        for _, event := range events {
            fmt.Println("Id del Evento :", event.ExtraData.Id, "\nInformación del Evento :", event.Info)
        }
    }
    
    type Event struct {
        Time      string     `json:"time"`
        ExtraData ExtraData  `json:"extra_data"`
        Info      string     `json:"info"`
    }
    
    type ExtraData struct {
        Id string `json:"id"`
    }
    

    Ten en cuenta que también agregué manejo de errores para verificar cualquier problema al leer el archivo o deserializar los datos JSON.

Comments are closed.