"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo deserializar los mensajes de JSON WebSocket como tipos de sindicatos en GO?

¿Cómo deserializar los mensajes de JSON WebSocket como tipos de sindicatos en GO?

Publicado el 2025-03-12
Navegar:983

How to Deserialize JSON Websocket Messages as Union Types in Go?

Deserializando los mensajes JSON WebSocket como tipos de unión en Go

en Go, la biblioteca Gorilla WebSocket se usa comúnmente para manejar las conexiones WebSocket. Sin embargo, cuando se usa JSON para la serialización y la deserialización, el manejo de mensajes entrantes de tipos variables presenta un desafío.

Considere el siguiente ejemplo donde tiene estructuras para los tipos de mensajes "foo" y "bar":

type Foo struct {
    A string `json:"a"`
    B string `json:"b"`
}

type Bar struct {
    C string `json:"c"`
    D string `json:"d"`
}

La función Conn.readjson de Gorilla le permite deserializar los mensajes JSON entrantes en estructuras específicas. Sin embargo, necesitaría usar las llamadas de Conn.readjson (foo) y Conn.readjson (bar) para manejar mensajes de diferentes tipos, que es ineficiente y engorrosa.

para abordar esto, puede usar una estructura intermedia que contiene un campo de control y un campo para mantener los datos reales de mensajes:

type Messages struct {
    Control string `json:"control"`
    X json.RawMessage
}
El campo de control indica el tipo de carga útil, y x contiene los datos de JSON sin procesar. Para deserializar mensajes entrantes usando este enfoque:

var m mensajes Err: = C.Readjson (& M) si err! = nil { // Error de manejo } Switch M.Control { Caso "foo": var foo foo if err: = json.unmarshal ([] byte (m.x), & foo); err! = nil { // Error de manejo } // Haz algo con Foo Caso "Bar": // sigue el mismo patrón para manejar la barra }
type Messages struct {
    Control string `json:"control"`
    X json.RawMessage
}
Esta solución le permite deserializar mensajes entrantes independientemente de su tipo, utilizando el tipo de interfaz RawMessage en json.rawmessage. La instrucción Switch verifica el campo de control para determinar el tipo de mensaje real y deserializar en consecuencia.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3