Maison > développement back-end > Golang > le corps du texte

Comment désérialiser les messages JSON Websocket en tant que types d'union dans Go ?

Linda Hamilton
Libérer: 2024-11-20 11:18:02
original
520 Les gens l'ont consulté

How to Deserialize JSON Websocket Messages as Union Types in Go?

Désérialisation des messages Websocket JSON en tant que types d'union dans Go

Dans Go, la bibliothèque Websocket gorilla est couramment utilisée pour gérer les connexions Websocket. Cependant, lorsque vous utilisez JSON pour la sérialisation et la désérialisation, la gestion des messages entrants de différents types présente un défi.

Considérez l'exemple suivant dans lequel vous avez des structures pour les types de message "Foo" et "Bar" :

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

type Bar struct {
    C string `json:"c"`
    D string `json:"d"`
}
Copier après la connexion

La fonction conn.ReadJSON de Gorilla vous permet de désérialiser les messages JSON entrants en structures spécifiques. Cependant, vous devrez utiliser des appels conn.ReadJSON(Foo) et conn.ReadJSON(Bar) distincts pour gérer les messages de différents types, ce qui est inefficace et fastidieux.

Pour résoudre ce problème, vous pouvez utiliser un intermédiaire struct qui contient un champ de contrôle et un champ pour contenir les données réelles du message :

type Messages struct {
    Control string `json:"control"`
    X json.RawMessage
}
Copier après la connexion

Le champ Contrôle indique le type de charge utile et X contient les données JSON brutes. Pour désérialiser les messages entrants en utilisant cette approche :

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
}
Copier après la connexion

Cette solution vous permet de désérialiser les messages entrants quel que soit leur type, en utilisant le type d'interface RawMessage dans json.RawMessage. L'instruction switch vérifie le champ de contrôle pour déterminer le type de message réel et le désérialise en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal