Décodage de données JSON avec une structure variable dans Go
Lorsque vous travaillez avec des données JSON provenant de sources tierces, il n'est pas rare de rencontrer des scénarios où la structure des données peut varier. Cela présente un défi pour les programmes Go qui utilisent des structures pour décomposer le JSON en types de données spécifiques.
Considérons un cas où les réponses JSON peuvent contenir soit un seul élément, soit un tableau au sein d'une propriété spécifique, telle que "gwrcmd". dans cet exemple. Une structure comme celle-ci conviendrait si "gwrcmd" est toujours un seul élément :
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string } } } } }
Cependant, si "gwrcmd" est parfois un tableau, nous rencontrerons une erreur lors de la désorganisation.
Utiliser json.RawMessage pour la flexibilité
Une approche commune de la gestion Les données JSON à structure variable doivent utiliser json.RawMessage, ce qui nous permet de capturer la valeur JSON arbitraire sans spécifier de type spécifique. Une fois que nous avons la valeur brute, nous pouvons l'examiner et décider comment la désorganiser davantage.
type Response struct { Gwrcmds struct { Gwrcmd json.RawMessage } }
Dans la méthode UnmarshalJSON pour la structure Response, nous pouvons inspecter le contenu de Gwrcmd et le désorganiser dans le fichier approprié. type :
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.Gwrcmds); err != nil { return err } if r.Gwrcmds.Gwrcmd[0] == '[' { return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray) } return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle) }
Dans ce cas, nous traitons à la fois les scénarios de tableau et d'élément unique en créant des champs séparés pour eux et en décomposant en fonction du contenu de la valeur brute.
Approches alternatives
Bien que json.RawMessage offre de la flexibilité, il nécessite une gestion manuelle de la structure des données et peut ne pas convenir dans tous les cas. Les approches alternatives incluent :
La meilleure approche dépend des exigences spécifiques de l'application et de la complexité des données JSON.
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!