Heim >Backend-Entwicklung >Golang >Wie gehe ich mit gemischten JSON-Nachrichtentypen in Go WebSocket mithilfe von Gorilla Websocket um?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-14 19:40:03387Durchsuche

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"`
}

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
}

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
}

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
}

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
}

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!

Stellungnahme:
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