Heim > Artikel > Backend-Entwicklung > Wie deserialisiere ich JSON-Websocket-Nachrichten als Union-Typen in Go?
JSON-Websocket-Nachrichten als Union-Typen in Go deserialisieren
In Go wird die Gorilla-Websocket-Bibliothek häufig für die Handhabung von Websocket-Verbindungen verwendet. Bei der Verwendung von JSON für die Serialisierung und Deserialisierung stellt die Verarbeitung eingehender Nachrichten unterschiedlicher Art jedoch eine Herausforderung dar.
Betrachten Sie das folgende Beispiel, in dem Sie Strukturen für die Nachrichtentypen „Foo“ und „Bar“ haben:
type Foo struct { A string `json:"a"` B string `json:"b"` } type Bar struct { C string `json:"c"` D string `json:"d"` }
Mit der conn.ReadJSON-Funktion von Gorilla können Sie eingehende JSON-Nachrichten in bestimmte Strukturen deserialisieren. Sie müssten jedoch separate Aufrufe von conn.ReadJSON(Foo) und conn.ReadJSON(Bar) verwenden, um Nachrichten unterschiedlichen Typs zu verarbeiten, was ineffizient und umständlich ist.
Um dieses Problem zu beheben, können Sie einen Vermittler nutzen Struktur, die ein Kontrollfeld und ein Feld zum Speichern der eigentlichen Nachrichtendaten enthält:
type Messages struct { Control string `json:"control"` X json.RawMessage }
Das Kontrollfeld gibt den Typ der Nutzlast an und X enthält die Rohdaten JSON-Daten. So deserialisieren Sie eingehende Nachrichten mit diesem Ansatz:
var m Messages err := c.ReadJSON(&m) if err != nil { // Handle error } switch m.Control { case "Foo": var foo Foo if err := json.Unmarshal([]byte(m.X), &foo); err != nil { // Handle error } // Do something with foo case "Bar": // Follow the same pattern for handling Bar }
Mit dieser Lösung können Sie eingehende Nachrichten unabhängig von ihrem Typ deserialisieren, indem Sie den Schnittstellentyp RawMessage in json.RawMessage verwenden. Die Switch-Anweisung überprüft das Steuerfeld, um den tatsächlichen Nachrichtentyp zu ermitteln und entsprechend zu deserialisieren.
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich JSON-Websocket-Nachrichten als Union-Typen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!