Heim > Backend-Entwicklung > Golang > Wie deserialisiere ich JSON-Websocket-Nachrichten als Union-Typen in Go?

Wie deserialisiere ich JSON-Websocket-Nachrichten als Union-Typen in Go?

Linda Hamilton
Freigeben: 2024-11-20 11:18:02
Original
587 Leute haben es durchsucht

How to Deserialize JSON Websocket Messages as Union Types 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"`
}
Nach dem Login kopieren

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

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

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!

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