Generische JSON-Serialisierung/Deserialisierung für Websockets in Go
Bei der Arbeit mit Websockets besteht häufig die Notwendigkeit, JSON-Daten für die Kommunikation zu serialisieren und zu deserialisieren zwischen Client und Server. Eine häufige Herausforderung besteht darin, eingehende Nachrichten unterschiedlichen Typs zu verarbeiten, beispielsweise Strukturen mit unterschiedlichen Feldern.
In diesem Szenario kann es bei der Verwendung von Gorilla Websocket und JSON für die Serialisierung und Deserialisierung umständlich sein, den Typ für jede Nachricht explizit anzugeben . Die Funktion conn.ReadJSON() erfordert die Angabe des spezifischen Typs, was bei der Verarbeitung mehrerer Nachrichtentypen nicht immer praktikabel ist.
Eine generische Lösung mit JSON-Steuerung
Eine generische Lösung besteht darin, eine Struktur zu definieren, die ein Kontrollfeld enthält, das den Nachrichtentyp angibt. Dieses Kontrollfeld ermöglicht es dem Programm, die spezifische Datenstruktur zu bestimmen, die für die Deserialisierung verwendet werden soll.
type Messages struct { Control string `json:"control"` X json.RawMessage }
Diese Nachrichtenstruktur enthält ein Kontrollfeld und ein X-Feld, das jede Art von JSON-Daten als Rohnachricht enthalten kann .
Deserialisieren und Verarbeiten von Nachrichten
Beim Empfang einer Nachricht mit conn.ReadJSON() können die Daten in der Messages-Struktur gespeichert werden. Das Steuerfeld kann dann verwendet werden, um den tatsächlichen Typ der im X-Feld gespeicherten Daten zu bestimmen.
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 the Bar struct }
Wenn in diesem Beispiel das Steuerfeld „Foo“ ist, wird das X-Feld in ein Foo deserialisiert Struktur mit json.Unmarshal(). Dieser Vorgang kann für andere Nachrichtentypen wiederholt werden.
Vorteile dieses Ansatzes:
Das obige ist der detaillierte Inhalt vonWie gehe ich mit der JSON-Serialisierung/Deserialisierung für mehrere Nachrichtentypen in Go-Websockets um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!