Maison >développement back-end >Golang >Pourquoi le champ Num est-il ignoré lors de la désorganisation des données JSON dans une structure contenant une structure intégrée ?
Désagrégation des structures intégrées dans JSON
Lorsque vous tentez de désorganiser des données JSON dans une structure contenant une structure intégrée, certains défis surviennent. Considérez le code suivant :
<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 l'utilisation de json.Unmarshal(data, &Outer{}), le champ Num est ignoré. Pourquoi cela se produit-il ?
Le problème vient de l'intégration d'Inner dans Outer. Lorsque la bibliothèque JSON appelle UnmarshalJSON sur Outer, elle l'appelle par inadvertance sur Inner. Par conséquent, l'argument data dans func (i *Inner) UnmarshalJSON(data []byte) contient l'intégralité de la chaîne JSON, qui est ensuite traitée uniquement pour Inner.
Pour résoudre ce problème, Inner doit être un argument explicite. champ en extérieur :
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
Voici un exemple démontrant la bonne approche :
<code class="go">package main import ( "encoding/json" "fmt" ) type Outer struct { I Inner `json:"I"` Num int `json:"Num"` } type Inner struct { Data string `json:"data"` } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { jsonStr := `{"I": "hello", "Num": 123}` var outer Outer err := json.Unmarshal([]byte(jsonStr), &outer) if err != nil { fmt.Println(err) } fmt.Println(outer) }</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!