Mi servidor websocket recibirá y eliminará los datos JSON. Estos datos siempre estarán envueltos en un objeto con pares clave/valor. La cadena clave actuará como identificador de valor, indicando al servidor Go qué clase de valor es. Al saber qué tipo de valor, puedo pasar a JSON para poner el valor en el tipo correcto de estructura.Parcialmente JSON unmarshal en un mapa en Go
Cada json-object puede contener varios pares de clave/valor.
Ejemplo JSON:
{
"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},
"say":"Hello"
}
¿Hay alguna forma fácil utilizando el paquete "encoding/json"
para hacer esto?
package main
import (
"encoding/json"
"fmt"
)
// the struct for the value of a "sendMsg"-command
type sendMsg struct {
user string
msg string
}
// The type for the value of a "say"-command
type say string
func main(){
data := []byte(`{"sendMsg":{"user":"ANisus","msg":"Trying to send a message"},"say":"Hello"}`)
// This won't work because json.MapObject([]byte) doesn't exist
objmap, err := json.MapObject(data)
// This is what I wish the objmap to contain
//var objmap = map[string][]byte {
// "sendMsg": []byte(`{"user":"ANisus","msg":"Trying to send a message"}`),
// "say": []byte(`"hello"`),
//}
fmt.Printf("%v", objmap)
}
¡Gracias por cualquier tipo de sugerencia/ayuda!
Perfect! Me he perdido cómo puedes usar 'RawMessage'. Exactamente lo que necesitaba. Acerca de 'say', en realidad todavía lo quiero como' json.RawMessage', porque la cadena todavía no está decodificada (envolviendo '" 'y escapándolos' \ n'-characters, etc.), así que también lo desempaquelaré. – ANisus
I corrigió mi respuesta para que coincida con lo que hizo. Gracias –
El tipo debe ser map [cadena] * json.RawMessage en su lugar porque los métodos Unmarshal/Marshal no están implementados en json.RawMessage. – albert