Maison > développement back-end > Golang > Comment puis-je regrouper les données JSON dans un type d'interface dans Go ?

Comment puis-je regrouper les données JSON dans un type d'interface dans Go ?

Barbara Streisand
Libérer: 2024-12-20 09:22:11
original
576 Les gens l'ont consulté

How Can I Unmarshal JSON Data into an Interface Type in Go?

Unmarshal vers un type d'interface

Dans RPC, le marshalling vers un type d'interface est simple puisque l'objet est local et que le réflecteur peut identifier son type sous-jacent. Cependant, la désorganisation d'un type d'interface présente un défi.

Le réflecteur ne peut pas déterminer le type concret à attribuer à la nouvelle instance qui recevra les données marshalées. Cette limitation s'applique à toutes les opérations de marshalling/unmarshalling.

Pour résoudre ce problème dans certains cadres, des informations supplémentaires sont fournies pour aider le réflecteur. Par exemple, dans Java Json(jackson), l'annotation JsonTypeInfo spécifie le type de classe.

Dans Go, l'implémentation de l'interface Unmarshaler pour votre type personnalisé peut relever ce défi. Prenons l'exemple suivant :

import (
    "encoding/json"
    "errors"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

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

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

func main() {
    a := A{}
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}
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