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
Patricia Arquetteoriginal
2025-01-02 20:51:38730parcourir

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
}

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

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!

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