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
Susan Sarandonoriginal
2024-12-16 07:22:10380parcourir

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

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

Sortie :

{"name": "BOB"}

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!

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