Maison > Article > développement back-end > Comment gérer les structures intégrées avec UnmarshalJSON personnalisé dans Go ?
Dans Go, lors du démarshalage de données JSON dans une structure avec des champs intégrés, on peut rencontrer des problèmes si la structure intégrée définit son propre méthode UnmarshalJSON. En effet, la bibliothèque JSON appelle UnmarshalJSON de la structure intégrée et ignore les champs définis dans la structure contenant.
Considérez la définition de structure suivante :
<code class="go">type Outer struct { Inner Num int } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil }</code>
Lors de la désorganisation de JSON dans Outer à l'aide de json.Unmarshal(data, &Outer{}), le champ Inner déclenche sa méthode UnmarshalJSON, consommant la totalité de la chaîne JSON. Cela entraîne l'ignorance du champ Num dans Outer.
Pour résoudre ce problème, convertissez la structure intégrée Inner en un champ explicite dans Outer :
<code class="go">type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
En faisant d'Inner un champ explicite, vous vous assurez que la bibliothèque JSON désorganise les données dans les champs appropriés d'Outer, y compris le champ Num.
<code class="go">import ( "encoding/json" "fmt" ) type Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { data := []byte(`{"Data": "Example", "Num": 42}`) var outer Outer err := json.Unmarshal(data, &outer) if err != nil { fmt.Println(err) } fmt.Println(outer.I.Data, outer.Num) // Output: Example 42 }</code>
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!