Maison >développement back-end >Golang >Comment intégrer idiomatiquement une structure avec un « MarshalJSON() » personnalisé dans Go ?
Le défi se pose lorsqu'une structure intégrée définit une méthode MarshalJSON() personnalisée, provoquant un comportement de sérialisation JSON inattendu lorsque vous tentez de rassembler la structure contenant.
Considérez les définitions de structure suivantes :
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
Marshaling la structure Employee comme prévu est simple :
p := Person{"Bob"} e := Employee{&p, "Sales"} output, _ := json.Marshal(e) fmt.Printf("%s\n", string(output))
Sortie :
{"name":"Bob","jobRole":"Sales"}
Cependant, définir une méthode MarshalJSON() personnalisée pour la structure intégrée, comme indiqué ci-dessous, perturbe le fonctionnement prévu. sérialisation :
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct{ Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
Maintenant, le marshaling de l'employé produit une sortie avec le champ de nom converti en majuscule mais manque le champ jobRole :
{"name":"BOB"}
Pour maintenir le comportement de sérialisation souhaité, évitez de définir une méthode MarshalJSON() sur la structure intégrée (Person). Au lieu de cela, créez un type distinct encapsulant la logique de marshalling personnalisée et intégrez ce type :
type Name string func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(struct{ Name string `json:"name"` }{ Name: strings.ToUpper(string(n)), }) } type Person struct { Name Name `json:"name"` }
Cette approche isole la personnalisation du marshalling dans un type dédié, évitant ainsi les effets secondaires inattendus lors de l'intégration de la structure Person ailleurs.
Exemple : https://play.golang.org/p/u96T4C6PaY
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!