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 :
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!