Maison  >  Article  >  développement back-end  >  Comment désorganiser une carte JSON dans une structure Go avec une gestion personnalisée ?

Comment désorganiser une carte JSON dans une structure Go avec une gestion personnalisée ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 06:21:30135parcourir

How to Unmarshal a JSON Map into a Go Struct with Custom Handling?

Démarshalage personnalisé d'une structure en une carte de tranches

Dans Go, le démarshaling implique la conversion de données JSON en une structure de données Go. Bien que les principes de base du démarshalage soient simples, des scénarios spécifiques, comme le remplissage d'une carte, peuvent nécessiter une gestion personnalisée.

Problème : remplir une carte dans le démarshaling

Un problème courant rencontré est celui de la tentative de démarshaling. mapper dans une structure Go. Prenons l'exemple suivant :

<code class="go">type OHLC_RESS struct {
    Pair map[string][]Candles
    Last int64 `json:"last"`
}

// Candles represents individual candlesticks within the map.
type Candles struct {
    // ... Time, Open, High, Low, Close, VWAP, Volume, Count fields omitted
}</code>

Lors de la tentative de désagrégation des données JSON avec la structure ci-dessus, le champ Dernier est renseigné avec succès, mais la carte Pair reste vide.

Solution : désagrégation personnalisée pour le Struct

Le processus de démarshaling par défaut dans Go utilise des noms de champs et des balises pour correspondre aux clés JSON. Cependant, dans ce cas, la mappe Pair nécessite une gestion personnalisée car ses noms de clés ne sont pas connus à l’avance. Pour y parvenir, implémentez l'interface json.Unmarshaler pour la structure OHLC_RESS :

<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
    // Decode only the object's keys and leave values as raw JSON.
    var obj map[string]json.RawMessage
    if err := json.Unmarshal(d, &obj); err != nil {
        return err
    }

    // Decode the "last" element into the Last field.
    if last, ok := obj["last"]; ok {
        if err := json.Unmarshal(last, &r.Last); err != nil {
            return err
        }
        delete(obj, "last")
    }

    // Decode the remaining elements into the 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>

Cette fonction de démarshalage personnalisée sépare le processus de décodage en étapes. Il décode d'abord les clés de l'objet, puis gère le "dernier" élément séparément et enfin, il décode les éléments restants dans la carte Pair. Cette approche permet de contrôler le processus de décodage et permet une gestion personnalisée de champs spécifiques comme la carte Pair.

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