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
Linda Hamiltonoriginal
2024-11-15 09:14:02734parcourir

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
}

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
}

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!

Déclaration:
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