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.

cómo convertir datos de tipo map[string]interface{} a una estructura

No sé cómo preguntar, así que preguntaré con un ejemplo.

Tengo algunos datos como estos:

{
..
    "velocityStatEntries":  {

"8753":  {

    "estimated":  {"value":  23.0,"text":  "23.0"},

    "completed":  {"value":  27.0,"text":  "27.0"}
},

"8673":  {

    "estimated":  {"value":  54.5,"text":  "54.5"},

    "completed":  {"value":  58.5,"text":  "58.5"}
},
.
.
.

}

..
}

Quiero declarar un tipo que tome la clave del mapa como su “KEY” o cualquier propiedad que le indique. ¿Es posible hacerlo sin usar la iteración de mapas?

Salida esperada:

{...
   "velocityStatEntries": {
   {
     "key": "8753",
     "estimated":  {"value":  54.5,"text":  "54.5"},
     "completed":  {"value":  58.5,"text":  "58.5"}
   },
   {
     "key": "8673",
     "estimated":  {"value":  54.5,"text":  "54.5"},
     "completed":  {"value":  58.5,"text":  "58.5"}
   },
  }
...
}

Esto es lo que he hecho:

type VelocityStatEntry struct {
    Key string
    Estimated struct {
        Value float64 `json:"value"`
        Text  string  `json:"text"`
    } `json:"estimated"`
    Completed struct {
        Value float64 `json:"value"`
        Text  string  `json:"text"`
    } `json:"completed"`
}

type RapidChartResponse struct {
    ...
    VelocityStatEntries map[string]VelocityStatEntry `json:"velocityStatEntries"`
    ..
}

Pero no está funcionando. Quiero que la clave del mapa se tome como propiedad “KEY”.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Lamentablemente, no es posible lograr esto sin iterar sobre el mapa. Esto se debe a que la implementación de Go para la codificación y decodificación JSON requiere que una estructura tenga un conjunto fijo de campos, y las claves del mapa no se consideran campos.

    Una solución posible sería crear un tipo personalizado que implemente la interfaz json.Unmarshaler, lo que te permitirá anular el comportamiento de decodificación predeterminado. En el método UnmarshalJSON del tipo personalizado, puedes iterar sobre el mapa y crear manualmente instancias de la estructura VelocityStatEntry con la clave asignada al campo Key. Sin embargo, este enfoque aún implicaría iterar sobre el mapa internamente y es probablemente más complejo que solo iterar sobre el mapa directamente.

Comments are closed.