Maison > développement back-end > Golang > Comment intégrer idiomatiquement une structure avec un « MarshalJSON() » personnalisé dans Go ?

Comment intégrer idiomatiquement une structure avec un « MarshalJSON() » personnalisé dans Go ?

Patricia Arquette
Libérer: 2024-12-06 13:18:11
original
355 Les gens l'ont consulté

How to Idiomatically Embed a Struct with a Custom `MarshalJSON()` in Go?

Méthode idiomatique pour intégrer une structure avec un MarshalJSON() personnalisé

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.

Contexte

Considérez les définitions de structure suivantes :

type Person struct {
    Name string `json:"name"`
}

type Employee struct {
    *Person
    JobRole string `json:"jobRole"`
}
Copier après la connexion

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))
Copier après la connexion

Sortie :

{"name":"Bob","jobRole":"Sales"}
Copier après la connexion

Le problème

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),
    })
}
Copier après la connexion

Maintenant, le marshaling de l'employé produit une sortie avec le champ de nom converti en majuscule mais manque le champ jobRole :

{"name":"BOB"}
Copier après la connexion

Solution idiomatique

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"`
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal