Maison  >  Article  >  développement back-end  >  Comment transformer une structure avec une carte de tranches en une carte de tranches en Go ?

Comment transformer une structure avec une carte de tranches en une carte de tranches en Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 04:58:30967parcourir

How to Unmarshal a Struct with a Map of Slices into a Map of Slices in Go?

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 :

  1. Décoder les clés de l'objet JSON en valeurs JSON non décodées.
  2. Identifiez le "dernier" élément et s'il est présent, décodez-le dans le champ Dernier.
  3. Déclarez la carte Pair et parcourez les éléments restants de l'objet JSON, en les décodant dans la carte.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn