Wie entmarshalieren Sie JSON-Daten mit benutzerdefinierten Feld-Tags in Go?

DDD
Freigeben: 2024-10-30 01:31:29
Original
881 Leute haben es durchsucht

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

Unmarshalling von JSON mit benutzerdefinierten Feldtags

Einführung

Bei der Arbeit mit JSON-Daten müssen diese häufig zur weiteren Verarbeitung in Strukturen konvertiert werden. Es treten jedoch Herausforderungen auf, wenn Strukturen Felder mit benutzerdefinierten Tags enthalten, die sich auf den Unmarshalling-Prozess auswirken. In diesem Artikel wird gezeigt, wie mit solchen Szenarien mithilfe der Reflexionsfunktionen von Go umgegangen wird.

Problemdefinition

In dieser speziellen Situation besteht das Ziel darin, JSON-Daten in einer Struktur zu entmarshalieren, in der eines ihrer Felder ein Tag hat Dies bedeutet, dass es als JSON-Zeichenfolge behandelt werden sollte. Betrachten wir dieses Beispiel:

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

type A struct {
    I int64
    S string `sql:"type:json"`
}</code>
Nach dem Login kopieren

In diesem Fall besteht das Ziel darin, das „S“-Feld im JSON als String in die Struktur A zu entmarshalieren.

Lösung

Go bietet eine integrierte UnmarshalJSON-Methode, die ein benutzerdefiniertes Unmarshalling-Verhalten ermöglicht. Durch die Erstellung eines neuen Typs und die Implementierung der Methoden MarshalJSON und UnmarshalJSON können wir das gewünschte Ergebnis erzielen:

<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>
Nach dem Login kopieren

In dieser Lösung implementiert der RawString-Typ die Methoden MarshalJSON und UnmarshalJSON, um zu steuern, wie JSON-Daten codiert werden und dekodiert, was im Wesentlichen ermöglicht, dass das Feld „S“ beim Unmarshalling als Zeichenfolge behandelt wird.

Fazit

Durch die Nutzung der Reflektionsfunktionen und benutzerdefinierten Unmarshalling-Methoden von Go ist es möglich, komplexe JSON-Unmarshalling-Szenarien zu bewältigen auch wenn Felder bestimmte Tags haben, die eine besondere Behandlung erfordern.

Das obige ist der detaillierte Inhalt vonWie entmarshalieren Sie JSON-Daten mit benutzerdefinierten Feld-Tags in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!