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"` }
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 }
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 }
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!