Maison >développement back-end >Golang >Comment puis-je personnaliser une structure dans une carte de tranches dans Go lorsque les clés JSON ne correspondent pas aux noms des champs de structure ?

Comment puis-je personnaliser une structure dans une carte de tranches dans Go lorsque les clés JSON ne correspondent pas aux noms des champs de structure ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 14:00:04822parcourir

How can I custom unmarshal a struct into a map of slices in Go when the JSON keys don't match the struct field names?

Décomposition personnalisée d'une structure dans une carte de tranches

Lorsque vous traitez des données JSON, vous pouvez rencontrer des scénarios dans lesquels vous devez mapper des éléments spécifiques de l'objet JSON à un champ qui correspond à votre structure de données. Cependant, le mécanisme de démarshaling JSON par défaut ne répond pas toujours à ces exigences. C'est là que le démarshalage personnalisé entre en jeu.

Dans l'exemple fourni, vous avez une structure OHLC_RESS avec un champ de carte Pair attendant des tranches de bougies comme valeurs. Cependant, le code initial ne parvient pas à remplir la carte Pair.

Comprendre le problème

Le comportement de démarshaling provient de plusieurs facteurs :

  1. Les clés d'objet JSON ne correspondent pas pour structurer les noms de champs.
  2. Le nom de champ Pair n'apporte aucune signification particulière au démarshaler.
  3. Le champ Dernier n'est pas marshalé car sa clé JSON (dernière) correspond au nom du champ.

Solution de Unmarshaling sur mesure

Pour résoudre ces problèmes, vous pouvez exploiter l'interface json.Unmarshaler en implémentant la méthode appropriée dans votre structure :

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

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

    // Unmarshal 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 solution :

  1. Sépare le décodage du champ Dernier des valeurs de l'objet restant.
  2. Crée une carte avec des clés de chaîne et des valeurs de []Candles pour stocker les paires.
  3. Parcourt les clés et valeurs JSON restantes, en les décomposant chacune dans une tranche de bougies et en les stockant dans la carte Pair.

En implémentant cette désorganisation personnalisée, vous gagnez la flexibilité nécessaire pour contrôler la façon dont les éléments JSON spécifiques sont mappé à la structure de données souhaitée, même lorsque la structure de l'objet JSON ne s'aligne pas directement avec elle.

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