Maison > développement back-end > Golang > Comment puis-je regrouper dynamiquement les données JSON en types génériques dans Go ?

Comment puis-je regrouper dynamiquement les données JSON en types génériques dans Go ?

Linda Hamilton
Libérer: 2024-12-17 20:09:11
original
136 Les gens l'ont consulté

How Can I Dynamically Unmarshal JSON Data into Generic Types in Go?

Utilisation de types génériques dans le démarshaling JSON avec Go

Dans Go, face au défi du démarshaling des données JSON dans une interface{}, il est essentiel de comprendre comment dynamiquement gérer différents types de données en fonction de clés spécifiques. Cet article résout ce problème en fournissant une solution pour transformer JSON dans une interface générique {} dans Go.

Le problème

Considérons un scénario dans lequel nous avons un type appelé Message avec une structure qui inclut un champ Cmd (chaîne) et un champ Données (interface{}). Nous avons également un type imbriqué CreateMessage qui définit une structure de données spécifique. Lors du démarshaling de données JSON telles que '{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}}', nous rencontrons un problème où le champ Données n'est pas correctement converti au type CreateMessage approprié.

La solution

Pour résoudre ce problème, utilisez ce qui suit approche :

  • Définissez un type Message avec un champ Data de type json.RawMessage pour capturer la partie variante du message.
  • Créez des types de structure pour chacune des différentes structures de données, tels que CreateMessage, et regroupez les données en fonction de la valeur Cmd.

Voici un exemple de code extrait qui démontre la solution :

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}
Copier après la connexion

En tirant parti de cette approche, les données JSON peuvent être dynamiquement désorganisées dans les structures de données appropriées, permettant une gestion flexible des variantes de données JSON dans Go.

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