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.
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>
In diesem Fall besteht das Ziel darin, das „S“-Feld im JSON als String in die Struktur A zu entmarshalieren.
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>
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.
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!