Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-28 04:58:30
original
966 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!