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
Patricia Arquetteoriginal
2024-12-06 13:18:11284parcourir

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"`
}

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"}

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),
    })
}

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

{"name":"BOB"}

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"`
}

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:
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