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

Comment désassembler les données JSON avec des balises de champ personnalisées dans Go ?

DDD
Libérer: 2024-10-30 01:31:29
original
943 Les gens l'ont consulté

How do you unmarshal JSON data with custom field tags in Go?

Désorganisation de JSON avec des balises de champ personnalisées

Introduction

Travailler avec des données JSON implique souvent de les convertir en structures pour un traitement ultérieur. Cependant, des défis surviennent lorsque les structures contiennent des champs avec des balises personnalisées qui ont un impact sur le processus de démarchage. Cet article montre comment gérer de tels scénarios en utilisant les capacités de réflexion de Go.

Définition du problème

Dans cette situation particulière, l'objectif est de regrouper les données JSON dans une structure où l'un de ses champs a une balise. cela indique qu'il doit être traité comme une chaîne JSON. Considérons cet exemple :

<code class="go">const data = `{
    "I": 3,
    "S": {
        "phone": {
            "sales": "2223334444"
        }
    }
}`

type A struct {
    I int64
    S string `sql:"type:json"`
}</code>
Copier après la connexion

Dans ce cas, l'objectif est de désorganiser le champ "S" dans le JSON sous forme de chaîne dans la structure A.

Solution

Go fournit une méthode UnmarshalJSON intégrée qui permet un comportement de démarshall personnalisé. En créant un nouveau type, en implémentant les méthodes MarshalJSON et UnmarshalJSON, nous pouvons obtenir le résultat souhaité :

<code class="go">import (
    "encoding/json"
    "errors"
    "log"
    "fmt"
)

// 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)
}</code>
Copier après la connexion

Dans cette solution, le type RawString implémente les méthodes MarshalJSON et UnmarshalJSON pour contrôler la manière dont les données JSON sont codées et décodé, permettant essentiellement au champ « S » d'être traité comme une chaîne lors du démarshalling.

Conclusion

En tirant parti des capacités de réflexion de Go et des méthodes de démarshalling personnalisées, il est possible de gérer des scénarios de démarshalling JSON complexes même lorsque les champs ont des balises spécifiques qui nécessitent un traitement spécial.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal