Maison > développement back-end > Golang > Comment puis-je réussir à décomposer les données JSON en types d'interface dans Go ?

Comment puis-je réussir à décomposer les données JSON en types d'interface dans Go ?

Patricia Arquette
Libérer: 2025-01-02 20:51:38
original
729 Les gens l'ont consulté

How Can I Successfully Unmarshal JSON Data to Interface Types in Go?

Désorganisation des types d'interface

L'un des défis des packages RPC et JSON de Go est la désorganisation des types d'interface. Examinons ce problème et explorons sa solution.

Le problème

Lorsque nous essayons de désorganiser un type d'interface, nous rencontrons des erreurs telles que "json : impossible de désorganiser l'objet dans Go valeur de type main.Foo." Cela se produit parce que le réflecteur ne peut pas déterminer le type concret approprié à instancier pour les données marshalées entrantes.

La solution

Le problème vient du manque d'informations de type disponibles pour le réflecteur lors du déclassement. Par exemple, bien que le marshalling soit possible à partir de variables de type d'interface, le démarshalling n'est pas dû à l'incapacité du réflecteur à identifier le type concret correspondant.

Pour résoudre ce problème, des frameworks comme Json de Java (jackson) utilisent des annotations pour fournir des tapez des informations. Cependant, dans Go, nous pouvons implémenter l'interface Unmarshaler pour les types personnalisés afin de gérer nous-mêmes le processus de démarshalling.

Implémentation d'Unmarshaler

Voici un exemple d'implémentation de l'interface Unmarshaler pour notre type personnalisé RawString :

type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
    *m += RawString(data)
    return nil
}
Copier après la connexion

Maintenant, nous pouvons désassembler les données JSON dans une instance RawString :

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}
Copier après la connexion

En fournissant l'implémentation Unmarshaler pour notre type personnalisé, nous pouvons désassembler les données JSON sans rencontrer l'erreur susmentionnée.

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