Benutzerdefiniertes Unmarshaling einer Struktur in eine Karte von Slices
In Go kann benutzerdefiniertes Unmarshaling verwendet werden, wenn das standardmäßige Unmarshaling-Verhalten nicht ausreicht. Stellen Sie sich das folgende Szenario vor: eine Struktur mit einem Kartenfeld, das aus einem JSON-Objekt mit dynamischen Schlüsseln gefüllt werden muss.
Beispielproblem
Der bereitgestellte Code demonstriert einen Versuch um eine JSON-Antwort in eine Struktur zu entmarshalieren, die eine Karte von Slice-Strukturen enthält (Paar-Map[String][]Kerzen). Allerdings bleibt die Karte nach dem Unmarshaling leer.
Lösung: Entscheidung für eine einfachere Struktur
Eine einfache Lösung besteht darin, die Karte zu entfernen und die Struktur so zu ändern, dass sie mit der übereinstimmt JSON-Struktur:
<code class="go">type OHLC_RESS struct { Pair []Candles `json:"XXBTZUSD"` Last int64 `json:"last"` }</code>
Benutzerdefiniertes Unmarshaling mit JSON.Unmarshaler
Um die kartenbasierte Struktur beizubehalten, ist alternativ eine benutzerdefinierte Implementierung der json.Unmarshaler-Schnittstelle erforderlich . Dieser Ansatz bietet vollständige Kontrolle über den Unmarshaling-Prozess.
Implementierungsdetails:
Code-Snippet:
<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error { // Decode keys only. var obj map[string]json.RawMessage if err := json.Unmarshal(d, &obj); err != nil { return err } // Decode "last" element. if last, ok := obj["last"]; ok { if err := json.Unmarshal(last, &r.Last); err != nil { return err } delete(obj, "last") } // Decode remaining elements into Pair map. r.Pair = make(map[string][]Candles, len(obj)) for key, val := range obj { cc := []Candles{} if err := json.Unmarshal(val, &cc); err != nil { return err } r.Pair[key] = cc } return nil }</code>
Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich eine Struktur mit einer Slices-Karte in eine Slices-Karte in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!