Wie gehe ich mit gemischten JSON-Nachrichtentypen in Go WebSocket mithilfe von Gorilla Websocket um?

Mary-Kate Olsen
Freigeben: 2024-11-14 19:40:03
Original
308 Leute haben es durchsucht

How to Handle Mixed JSON Message Types in Go WebSocket using Gorilla Websocket?

Go WebSocket JSON-Serialisierung/Deserialisierung: Umgang mit gemischten eingehenden Nachrichten

In Go wird das Gorilla-Websocket-Paket für die WebSocket-Kommunikation verwendet und eingehende Nachrichten verarbeitet Mischtypen können eine Herausforderung darstellen. Die conn.ReadJSON-Funktion der Bibliothek ist auf die Deserialisierung in einen einzelnen Strukturtyp beschränkt.

Problemstellung

Betrachten Sie zwei Strukturen, Foo und Bar, die eingehende Nachrichtentypen darstellen:

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

type Bar struct {
    C string `json:"c"`
    D string `json:"d"`
}
Nach dem Login kopieren

Die Anforderung besteht darin, diese eingehenden Nachrichten zu verarbeiten und ihren Typ (Foo oder Bar) entsprechend zu identifizieren Deserialisieren Sie sie in die entsprechende Struktur.

Lösung

Um gemischte eingehende Nachrichten zu verarbeiten, kann der folgende Ansatz verwendet werden:

1. Verwenden Sie eine Wrapper-Struktur:

Erstellen Sie eine Wrapper-Struktur, Nachrichten, die ein Steuerfeld zur Angabe des Nachrichtentyps und ein X-Feld zur Aufnahme der deserialisierten Daten enthält.

type Messages struct {
    Control string `json:"control"`
    X json.RawMessage
}
Nach dem Login kopieren

2. ReadJSON in die Wrapper-Struktur:

Verwenden Sie conn.ReadJSON, um die eingehende Nachricht in die Messages-Struktur zu deserialisieren.

var m Messages
err := c.ReadJSON(&m)
if err != nil {
    // handle error
}
Nach dem Login kopieren

3. Analysieren Sie den Nachrichtentyp:

Bestimmen Sie basierend auf dem Wert von m.Control den tatsächlichen Nachrichtentyp (Foo oder Bar).

switch m.Control {
case "Foo":
    // Convert the JSON to a Foo struct
case "Bar":
    // Convert the JSON to a Bar struct
}
Nach dem Login kopieren

Beispielcode:

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 pattern for Foo
}
Nach dem Login kopieren

Durch die Verwendung von json.RawMessage in der Messages-Struktur können die deserialisierten Daten verarbeitet werden dynamisch basierend auf dem Nachrichtentyp. Diese Lösung ermöglicht eine flexible Handhabung eingehender Nachrichten mit unterschiedlichen Strukturen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit gemischten JSON-Nachrichtentypen in Go WebSocket mithilfe von Gorilla Websocket um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage