Maison >développement back-end >Golang >Comment gérer les structures intégrées avec UnmarshalJSON personnalisé dans Go ?

Comment gérer les structures intégrées avec UnmarshalJSON personnalisé dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 14:29:02213parcourir

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

Gestion des erreurs : démarshalage personnalisé pour les structures intégrées

Dans Go, lors du démarshalage de données JSON dans une structure avec des champs intégrés, on peut rencontrer des problèmes si la structure intégrée définit son propre méthode UnmarshalJSON. En effet, la bibliothèque JSON appelle UnmarshalJSON de la structure intégrée et ignore les champs définis dans la structure contenant.

Étude de cas

Considérez la définition de structure suivante :

<code class="go">type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}</code>

Lors de la désorganisation de JSON dans Outer à l'aide de json.Unmarshal(data, &Outer{}), le champ Inner déclenche sa méthode UnmarshalJSON, consommant la totalité de la chaîne JSON. Cela entraîne l'ignorance du champ Num dans Outer.

Solution : Champ explicite

Pour résoudre ce problème, convertissez la structure intégrée Inner en un champ explicite dans Outer :

<code class="go">type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}</code>

En faisant d'Inner un champ explicite, vous vous assurez que la bibliothèque JSON désorganise les données dans les champs appropriés d'Outer, y compris le champ Num.

Exemple

<code class="go">import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

func main() {
    data := []byte(`{"Data": "Example", "Num": 42}`)
    var outer Outer
    err := json.Unmarshal(data, &outer)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}</code>

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