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

Comment désorganiser les données JSON avec des champs balisés dans Go ?

Patricia Arquette
Libérer: 2024-10-30 08:28:27
original
544 Les gens l'ont consulté

How to Unmarshal JSON Data with Tagged Fields in Go?

Comment désorganiser JSON avec des champs balisés

Lors de la désorganisation de JSON dans une structure, il peut être nécessaire de spécifier comment certains champs sont gérés. Pour ce faire, des balises peuvent être ajoutées aux champs struct pour fournir des informations supplémentaires au processus de démarshalisation.

Dans un scénario où vous devez démarshaler un champ JSON sous forme de chaîne dans un champ struct avec une balise, un une solution simple utilisant la réflexion peut être mise en œuvre :

<code class="go">package main

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

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

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

func main() {
    var a A
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }

    rt := reflect.TypeOf(a)
    rv := reflect.ValueOf(&a)
    for i := 0; i < rt.NumField(); i++ {
        f := rt.Field(i)
        if f.Tag.Get("json") != "" {
            fv := rv.Elem().Field(i)
            fv.SetString(string(fv.Bytes()))
        }
    }

    fmt.Println("Done", a)
}</code>
Copier après la connexion

Cependant, une approche plus élégante est disponible dans Go qui élimine le besoin de réflexion :

<code class="go">package main

import (
    "encoding/json"
    "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)
}</code>
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!