"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-11-09
Parcourir:628

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

type Outer struct {
    Inner
    Num int
}

type Inner struct {
    Data string
}

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

Lors du démarshaling JSON en 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 :

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

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

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
}
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3