Maison  >  Article  >  développement back-end  >  Comment regrouper des données JSON complexes dans des structures imbriquées dans Go ?

Comment regrouper des données JSON complexes dans des structures imbriquées dans Go ?

DDD
DDDoriginal
2024-11-06 11:31:02338parcourir

How to Unmarshal Complex JSON Data into Nested Structures in Go?

Décomposer les données JSON complexes dans des structures imbriquées

Dans Go, la désorganisation des données JSON dans des structures complexes peut parfois nécessiter une manipulation spécialisée. Cet article explore un scénario dans lequel le format de sortie souhaité diffère de la représentation par défaut des structures.

Le problème

Considérez les données JSON suivantes :

<code class="json">b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)</code>

Utilisation des éléments suivants struct :

<code class="go">type Message struct {
    Asks [][]float64 `json:"Bids"`
    Bids [][]float64 `json:"Asks"`
}</code>

Nous pouvons décompresser les données comme suit :

<code class="go">m := new(Message)
err := json.Unmarshal(b, &m)
if err != nil {
    // Handle error
}</code>

Cependant, nous préférerions avoir les données non marshalées au format suivant :

<code class="go">type Message struct {
    Asks []Order `json:"Bids"`
    Bids []Order `json:"Asks"`
}

type Order struct {
    Price float64
    Volume float64
}</code>

La solution

Pour y parvenir, nous pouvons implémenter l'interface json.Unmarshaler sur notre structure Order :

<code class="go">func (o *Order) UnmarshalJSON(data []byte) error {
    var v [2]float64
    if err := json.Unmarshal(data, &v); err != nil {
        return err
    }
    o.Price = v[0]
    o.Volume = v[1]
    return nil
}</code>

Cela demande au décodeur JSON de traiter Order comme un tableau à 2 éléments de flotteurs plutôt que d'un objet.

Utilisation

Maintenant, nous pouvons désorganiser les données JSON et accéder aux valeurs comme nous le souhaitons :

<code class="go">m := new(Message)
err := json.Unmarshal(b, &m)
if err != nil {
    // Handle error
}

fmt.Println(m.Asks[0].Price)</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