Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-04 14:29:02
original
205 Les gens l'ont consulté

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

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

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

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