unmarshal print lib handling golang json go

print - json tags golang



¿Cómo descomprimir JSON en la interfaz{} en Go? (1)

Defina un tipo de estructura para la parte fija del mensaje con un campo json.RawMessage para capturar la parte json.RawMessage del mensaje. Defina los tipos de estructura para cada uno de los tipos de variantes y decodifíquelos según el comando.

type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` } func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }

ejemplo de patio de recreo

Soy un novato en Go y ahora tengo un problema. Tengo un tipo llamado Mensaje, es una estructura como esta:

type Message struct { Cmd string `json:"cmd"` Data interface{} `json:"data"` }

También tengo un tipo llamado CreateMessage como este:

type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }

Y tengo una cadena JSON como {"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}} .

Cuando uso json.Unmarshal para decodificar eso en una variable de Mensaje, la respuesta es {Cmd:create Data:map[conf:map[a:1] info:map[b:2]]} .

Entonces, ¿podría decodificar el JSON en una estructura de mensaje y cambiar la interfaz de sus datos {} para escribir CreateMessage de acuerdo con el Cmd?

Intenté convertir los datos directamente en el tipo CreateMessage pero el complaciente me dijo que Data es un tipo de interfaz de mapa [sting] {}.