Marshaling JSON dans une interface dans Go
Lorsque vous traitez des structures de données complexes, il est souvent nécessaire de marshaler JSON dans une interface{} pour permettre la flexibilité et le polymorphisme. Cet article fournit une solution à un scénario spécifique dans lequel vous souhaitez rassembler JSON dans une interface{} et le convertir dynamiquement en un type spécifique en fonction de la valeur d'un champ.
Description du problème
Considérez la situation suivante : vous disposez d'un type Message avec un champ d'interface{} appelé Data. Vous disposez également d'un type CreateMessage qui représente une variante spécifique du champ Data. Lors du démarshaling d'une chaîne JSON contenant à la fois une commande ("create" dans ce cas) et des données qui correspondent au type CreateMessage, vous rencontrez le problème des données restant en tant qu'interface{}.
Solution
Pour résoudre ce problème, vous devez tirer parti du système de types de Go et de la flexibilité de JSON. Définissez un nouveau type de structure, Message, qui intègre le type Message d'origine et ajoute un champ RawMessage appelé Data. RawMessage est un type spécial fourni par le package encoding/json qui vous permet de stocker des données JSON arbitraires sans perdre d'informations de type.
type Message struct { Cmd string Data json.RawMessage }
Ensuite, définissez un type de structure pour chaque variante du champ Data, dans ce cas, CreateMessage :
type CreateMessage struct { Conf map[string]int Info map[string]int }
Maintenant, dans votre code de démarshaling, vous pouvez activer la valeur du champ Cmd et décoder les données en le type concret approprié :
switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal(m.Data, &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") }
Cette approche vous permet de désorganiser JSON dans une interface{} tout en préservant la possibilité de le convertir ultérieurement en un type spécifique basé sur une valeur connue.
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!