Maison > développement back-end > Golang > Comment marshalJSON() correctement lors de l'intégration de structures avec des méthodes MarshalJSON() personnalisées ?

Comment marshalJSON() correctement lors de l'intégration de structures avec des méthodes MarshalJSON() personnalisées ?

Susan Sarandon
Libérer: 2024-12-16 07:22:10
original
376 Les gens l'ont consulté

How to Correctly MarshalJSON() When Embedding Structs with Custom MarshalJSON() Methods?

Manière idiomatique d'intégrer une structure avec la méthode MarshalJSON() personnalisée

Intégrer une structure avec une structure MarshalJSON() personnalisée

Quand en intégrant une structure avec une méthode MarshalJSON() personnalisée, les champs de la structure externe sont promus au type promu, en remplaçant la méthode MarshalJSON() de la structure intégrée. Cela peut conduire à des résultats inattendus lors du rassemblement de la structure externe.

Problème :

Considérez les structures suivantes :

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

func (p *Person) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        Name string `json:"name"`
    }{
        Name: strings.ToUpper(p.Name),
    })
}

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

Marshalling d'une instance Employee produit de l'inattendu résultats :

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

Le champ jobRole est manquant, bien qu'il soit défini sur l'instance Employee.

Solution :

Option 1 : éviter MarshalJSON() sur Embedded Tapez

  • Supprimez la méthode MarshalJSON() de la structure Person.
  • Au lieu de cela, créez un type distinct (par exemple, Name) qui implémente MarshalJSON().
  • Mettez à jour la structure Person pour utiliser le nouveau type (par exemple, Person{Name : Name{"Bob"}}).
  • Les structures des employés hériteront de l'encodage JSON personnalisé du type Name.

Option 2 : implémenter MarshalJSON() sur le type externe

  • Implémenter une méthode MarshalJSON() sur l'employé struct.
  • Appelez la méthode MarshalJSON() de l'instance de personne intégrée pour obtenir sa représentation JSON.
  • Démarrez le JSON de la personne dans une représentation intermédiaire (par exemple, map[string]interface{}).
  • Ajoutez les champs de la structure externe à la représentation intermédiaire et rassemblez-la vers JSON.

Remarque : Les deux options nécessitent une manipulation manuelle et peuvent affecter l'ordre des champs dans la sortie JSON finale.

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!

source:php.cn
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