Maison >développement back-end >Golang >Comment désérialiser efficacement plusieurs types de messages JSON dans Go Websocket à l'aide de json.RawMessage ?

Comment désérialiser efficacement plusieurs types de messages JSON dans Go Websocket à l'aide de json.RawMessage ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-24 03:51:14955parcourir

How to Deserialize Multiple JSON Message Types Efficiently in Go Websocket Using json.RawMessage?

Go Websocket : désérialisation de plusieurs types de messages JSON à l'aide de json.RawMessage

Lorsque vous travaillez avec Gorilla Websocket, gestion des messages JSON entrants de plusieurs types peut présenter un défi. Utiliser la méthode ReadJSON pour chaque type séparément peut être fastidieux. Cet article explore une solution qui utilise le type json.RawMessage pour gérer efficacement la désérialisation.

Problème :

Comment pouvons-nous désérialiser les messages JSON entrants dans différentes structures basées sur un champ de contrôle dans le JSON, sans utiliser plusieurs ReadJSON appels ?

Solution :

Définir une structure wrapper Messages avec un champ Control pour indiquer le type des données réelles et un champ X de type json.RawMessage à conserver les données sérialisées.

type Messages struct {
    Control string          `json:"control"`
    X       json.RawMessage `json:"X"`
}

Désorganisez le message JSON entrant dans les messages struct.

var m Messages
err := c.ReadJSON(&m)

Examinez le champ Contrôle pour déterminer le type réel des données. Décomposez le champ X dans la structure appropriée.

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
}

L'utilisation de json.RawMessage permet une approche générique pour désérialiser les messages entrants de différents types, simplifiant ainsi la gestion de plusieurs types de messages dans une application Websocket.

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