Démarshalage personnalisé d'une structure dans une carte de tranches
Dans Go, le démarshalage personnalisé peut être utilisé lorsque le comportement de démarshalage par défaut ne suffit pas. Considérons le scénario suivant : une structure avec un champ de carte qui doit être rempli à partir d'un objet JSON avec des clés dynamiques.
Exemple de problème
Le code fourni illustre une tentative pour désassembler une réponse JSON dans une structure contenant une carte de structures de tranche (Pair map[string][]Candles). Cependant, la carte reste vide après le démarshaling.
Solution : opter pour une structure plus simple
Une solution simple consiste à éliminer la carte et à modifier la structure pour l'aligner sur la Structure JSON :
<code class="go">type OHLC_RESS struct { Pair []Candles `json:"XXBTZUSD"` Last int64 `json:"last"` }</code>
Unmarshaling personnalisé à l'aide de JSON.Unmarshaler
Alternativement, pour préserver la structure basée sur la carte, une implémentation personnalisée de l'interface json.Unmarshaler est requise . Cette approche offre un contrôle complet sur le processus de démarshalage.
Détails de mise en œuvre :
Extrait de code :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!