Heim > Backend-Entwicklung > Golang > Wie gehe ich mit der JSON-Serialisierung/Deserialisierung für mehrere Nachrichtentypen in Go-Websockets um?

Wie gehe ich mit der JSON-Serialisierung/Deserialisierung für mehrere Nachrichtentypen in Go-Websockets um?

Linda Hamilton
Freigeben: 2024-11-15 09:14:02
Original
717 Leute haben es durchsucht

How to Handle JSON Serialization/Deserialization for Multiple Message Types in Go Websockets?

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

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

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:

  • Ermöglicht die generische Verarbeitung von Nachrichten mehrerer Typen.
  • Vereinfacht den Prozess des Lesens und Verarbeitens von Nachrichten.
  • Verbessert die Wartbarkeit des Codes durch Entkopplung der Nachrichtentypverarbeitung von der Kommunikationslogik.

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!

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