Maison >développement back-end >Golang >Comment intégrer JSON dans des interfaces Go en fonction d'une valeur de champ dynamique ?

Comment intégrer JSON dans des interfaces Go en fonction d'une valeur de champ dynamique ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 20:01:11592parcourir

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

Désorganisation de JSON dans des interfaces dans Go

Considérez le scénario dans lequel vous disposez d'une chaîne JSON avec des structures de données variées en fonction d'un champ spécifique, tel comme champ "cmd". Vous souhaitez désassembler ce JSON dans une structure Go contenant un champ avec un type interface{} et l'adapter à différentes structures de données en fonction de la valeur "cmd".

Solution

Pour y parvenir, définissez une structure de base avec des champs fixes et un champ json.RawMessage pour contenir les données variantes. Ensuite, créez des types de structure spécifiques pour chaque variante et désorganisez-les en fonction de la commande.

Par exemple :

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

Dans cet exemple, la structure Message représente la structure globale du message, contenant le champ "cmd" et un champ json.RawMessage pour contenir les données des variantes. CreateMessage est un type de structure spécifique représentant la variante de commande "create".

Le code désorganise la chaîne JSON initiale dans une variable Message, puis utilise le champ "cmd" pour déterminer quelle variante spécifique doit être désorganisée et imprimée.

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