Désagrégation du JSON dynamique avec une clé de type intégrée
Dans Go, la désorganisation des données JSON dans une structure avec un champ de type dynamique peut être stimulant. Cet article explore une solution qui exploite des structures personnalisées et une clé de type intégrée pour y parvenir.
Énoncé du problème
Considérez la structure JSON suivante :
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
Nous voulons désorganiser ce JSON dans une structure Go qui a un champ DynamicField d'un type d'interface Something. En fonction de la valeur de la clé de type dans le JSON, DynamicField doit correspondre soit à DynamicTypeA, soit à DynamicTypeB.
Solution
Pour résoudre ce problème, nous définissons la personnalisation suivante structs :
type Something interface { GetType() string } type DynamicType struct { Type string `json:"type"` Value interface{} `json:"-"` // Not exported }
DynamicType représente le champ dynamique, avec la clé Type intégrée pour déterminer le type réel du données. Le champ Value n'est pas exporté pour empêcher l'accès direct.
Ensuite, nous définissons la structure Go pour représenter le JSON :
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` }
Enfin, nous implémentons la méthode UnmarshalJSON pour DynamicType :
func (d *DynamicType) UnmarshalJSON(data []byte) error { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(data, &typ); err != nil { return err } switch typ.Type { case "A": d.Value = new(DynamicTypeA) case "B": d.Value = new(DynamicTypeB) } return json.Unmarshal(data, d.Value) }
Cette méthode désorganise la clé de type puis crée une structure appropriée (DynamicTypeA ou DynamicTypeB) en fonction de la valeur. Il désorganise ensuite les données JSON restantes dans la structure créée, qui est ensuite stockée dans le champ Valeur.
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!