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

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

DDD
Libérer: 2024-11-06 11:31:02
original
348 Les gens l'ont consulté

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

Utilisation des éléments suivants struct :

<code class="go">type Message struct {
    Asks [][]float64 `json:"Bids"`
    Bids [][]float64 `json:"Asks"`
}</code>
Copier après la connexion

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

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

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

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>
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
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!