Heim  >  Artikel  >  Backend-Entwicklung  >  Wie entmarshaliere ich JSON-Daten mit getaggten Feldern in Go?

Wie entmarshaliere ich JSON-Daten mit getaggten Feldern in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 08:28:27523Durchsuche

How to Unmarshal JSON Data with Tagged Fields in Go?

So entmarshalieren Sie JSON mit getaggten Feldern

Beim Unmarshaling von JSON in einer Struktur kann es erforderlich sein, anzugeben, wie bestimmte Felder behandelt werden. Zu diesem Zweck können Tags zu den Strukturfeldern hinzugefügt werden, um zusätzliche Informationen für den Unmarshaling-Prozess bereitzustellen.

In einem Szenario, in dem Sie ein JSON-Feld als Zeichenfolge in ein Strukturfeld mit einem Tag entmarshalieren müssen, a Eine einfache Lösung mithilfe von Reflexion kann implementiert werden:

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

In Go ist jedoch ein eleganterer Ansatz verfügbar, der die Notwendigkeit einer Reflexion überflüssig macht:

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

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich JSON-Daten mit getaggten Feldern in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn