Heim > Artikel > Backend-Entwicklung > Wie entmarshaliere ich JSON-Daten mit getaggten Feldern 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!