Dans Go, lors du démarshaling 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 :
type Outer struct {
Inner
Num int
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
Lors du démarshaling JSON en 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 :
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
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.
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
}
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3