Désagrégation du JSON dynamique basé sur une clé de type sans introduire de champs génériques
De nombreuses données JSON structurées nécessitent une désorganisation dans des structures Go, contenant souvent des champs imbriqués avec différents types de données. Lorsque le type de données d'un champ imbriqué varie en fonction d'une clé de type dans le JSON, les méthodes conventionnelles de désorganisation à l'aide de champs personnalisés peuvent conduire à un code passe-partout inutile.
Dans ce contexte, considérons la spécification JSON suivante :
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
et
{ "some_data": "foo", "dynamic_field": { "type": "B", "address": "Somewhere" }, "other_data": "bar" }
Ces deux documents JSON doivent être désorganisés dans le même Go struct :
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` }
Le défi réside dans la définition du type « Quelque chose » qui peut accueillir des données dynamiques en fonction de la clé « type » dans l'objet « dynamic_field ».
Pour éviter d'avoir besoin pour un champ « générique » explicite (par exemple, Valeur, Données), nous pouvons exploiter la puissance de l'intégration de types et interfaces.
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` } type DynamicType struct { Value interface{} }
Dans le « DynamicType », le champ « Valeur » peut contenir tout type de données, en fonction de la clé « type » dans le JSON. Pour faciliter un bon désorganisation, nous implémentons la méthode UnmarshalJSON sur le '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(TypeA) case "B": d.Value = new(TypeB) } return json.Unmarshal(data, d.Value) }
Nous définissons des types spécifiques pour différents types de données :
type TypeA struct { Name string `json:"name"` } type TypeB struct { Address string `json:"address"` }
Avec cette approche, nous pouvons désorganisez les documents JSON sans avoir besoin d'un champ générique supplémentaire, ce qui nous permet de maintenir une structure de données propre et extensible.
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!