Maison >développement back-end >Golang >Comment gérer les types de messages JSON mixtes dans Go WebSocket à l'aide de Gorilla Websocket ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-14 19:40:03384parcourir

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

L'exigence est de traiter ces messages entrants, d'identifier leur type (Foo ou Bar) et de les désérialiser en conséquence 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ées 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!

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