Maison > développement back-end > Golang > le corps du texte

Comment gérer les types de messages JSON mixtes dans Go WebSocket à l'aide de Gorilla Websocket ?

Mary-Kate Olsen
Libérer: 2024-11-14 19:40:03
original
308 Les gens l'ont consulté

How to Handle Mixed JSON Message Types in Go WebSocket using Gorilla Websocket?

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

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

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

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

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

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!

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