Maison > développement back-end > Golang > Comment gérer la sérialisation/désérialisation JSON pour plusieurs types de messages dans Go Websockets ?

Comment gérer la sérialisation/désérialisation JSON pour plusieurs types de messages dans Go Websockets ?

Linda Hamilton
Libérer: 2024-11-15 09:14:02
original
718 Les gens l'ont consulté

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

Sérialisation/désérialisation JSON générique pour Websockets dans Go

Lorsque vous travaillez avec des websockets, il est souvent nécessaire de sérialiser et de désérialiser les données JSON pour la communication entre client et serveur. Un défi courant consiste à gérer les messages entrants de différents types, tels que les structures avec des champs variables.

Dans ce scénario, en utilisant Gorilla Websocket et JSON pour la sérialisation et la désérialisation, il peut être fastidieux de spécifier explicitement le type de chaque message. . La fonction conn.ReadJSON() nécessite que le type spécifique soit fourni, ce qui n'est pas toujours pratique lorsqu'il s'agit de plusieurs types de messages.

Une solution générique utilisant le contrôle JSON

Une solution générique consiste à définir une structure qui contient un champ de contrôle indiquant le type de message. Ce champ de contrôle permet au programme de déterminer la structure de données spécifique à utiliser pour la désérialisation.

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

Cette structure Messages comprend un champ de contrôle et un champ X, qui peuvent contenir tout type de données JSON sous forme de message brut. .

Désérialisation et gestion des messages

Lors de la réception d'un message à l'aide conn.ReadJSON(), les données peuvent être stockées dans la structure Messages. Le champ Contrôle peut ensuite être utilisé pour déterminer le type réel de données stockées dans le champ X.

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

Dans cet exemple, si le champ Contrôle est "Foo", le champ X est désérialisé en un Foo struct en utilisant json.Unmarshal(). Ce processus peut être répété pour d'autres types de messages.

Avantages de cette approche :

  • Permet de gérer des messages de plusieurs types de manière générique.
  • Simplifie le processus de lecture et de traitement des messages.
  • Améliore la maintenabilité du code en dissociant la gestion du type de message de la communication. logique.

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