Sérialisation/désérialisation Go WebSocket JSON : gestion des messages entrants mixtes
In Go, utilisation du package Websocket gorilla pour la communication WebSocket, gestion des messages entrants de types mixtes peut poser un défi. La fonction conn.ReadJSON de la bibliothèque se limite à la désérialisation en un seul type de structure.
Énoncé du problème
Considérez deux structures, Foo et Bar, représentant les types de messages entrants :
type Foo struct { A string `json:"a"` B string `json:"b"` } type Bar struct { C string `json:"c"` D string `json:"d"` }
L'exigence est de traiter ces messages entrants, en identifiant leur type (Foo ou Bar) et en conséquence en les désérialisant dans la structure appropriée.
Solution
Pour gérer les messages entrants mixtes, l'approche suivante peut être utilisée :
1. Utilisez une structure Wrapper :
Créez une structure wrapper, Messages, qui comprend un champ de contrôle pour spécifier le type de message et un champ X pour contenir les données désérialisées.
type Messages struct { Control string `json:"control"` X json.RawMessage }
2. ReadJSON dans la structure Wrapper :
Utilisez conn.ReadJSON pour désérialiser le message entrant dans la structure Messages.
var m Messages err := c.ReadJSON(&m) if err != nil { // handle error }
3. Analyser le type de message :
En fonction de la valeur de m.Control, déterminez le type de message réel (Foo ou Bar).
switch m.Control { case "Foo": // Convert the JSON to a Foo struct case "Bar": // Convert the JSON to a Bar struct }
Exemple de code :
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 pattern for Foo }
En utilisant json.RawMessage dans la structure Messages, les données désérialisées peuvent être géré dynamiquement en fonction du type de message. Cette solution permet un traitement flexible des messages entrants avec différentes structures.
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!