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

Comment pouvons-nous aplatir les réponses JSON imbriquées dans Go ?

Patricia Arquette
Libérer: 2024-10-27 16:22:29
original
490 Les gens l'ont consulté

How Can We Flatten Nested JSON Responses in Go?

Aplatissement des réponses JSON imbriquées dans Go

Lorsque vous travaillez avec des données JSON, il est courant de rencontrer des structures imbriquées. Si cette organisation hiérarchique peut apporter de la clarté, elle peut également rendre difficile l’accès efficace à des données spécifiques. Pour simplifier ce processus, l'aplatissement des réponses JSON imbriquées peut être bénéfique.

Implémentation d'unmarshalJSON personnalisé

Pour aplatir les réponses JSON imbriquées dans Go, une approche consiste à implémenter une fonction UnmarshalJSON personnalisée pour le type de structure souhaité. . Cette fonction vous permet de gérer le processus de démarshalage et de transformer les données en conséquence.

Dans le code Go fourni, une structure sociale représente le format aplati souhaité :

<code class="go">type Social struct {
    GooglePlusPlusOnes uint32 `Social:"GooglePlusOne"`
    TwitterTweets uint32 `json:"Twitter"`
    LinkedinShares uint32 `json:"LinkedIn"`
    PinterestPins uint32 `json:"Pinterest"`
    StumbleuponStumbles uint32 `json:"StumbleUpon"`
    DeliciousBookmarks uint32 `json:"Delicious"`
    FacebookLikes uint32 `json:"??some_magical_nested_address??"`
    FacebookShares uint32 `json:"??some_magical_nested_address??"`
    FacebookComments uint32 `json:"??some_magical_nested_address??"`
    FacebookTotal uint32 `json:"??some_magical_nested_address??"`
}</code>
Copier après la connexion

Pour aplatir le Facebook imbriqué data, vous pouvez implémenter la fonction UnmarshalJSON comme suit :

<code class="go">func (s *Social) UnmarshalJSON(data []byte) error {
    type SocialTemp struct {
        GooglePlusPlusOnes  uint32 `json:"GooglePlusOne"`
        TwitterTweets       uint32 `json:"Twitter"`
        LinkedinShares      uint32 `json:"LinkedIn"`
        PinterestPins       uint32 `json:"Pinterest"`
        StumbleuponStumbles uint32 `json:"StumbleUpon"`
        DeliciousBookmarks  uint32 `json:"Delicious"`
        Facebook           struct {
            FacebookLikes    uint32 `json:"like_count"`
            FacebookShares   uint32 `json:"share_count"`
            FacebookComments uint32 `json:"comment_count"`
            FacebookTotal    uint32 `json:"total_count"`
        } `json:"Facebook"`
    }
    
    var temp SocialTemp
    if err := json.Unmarshal(data, &temp); err != nil {
        return err
    }
    
    *s = Social{
        GooglePlusPlusOnes:  temp.GooglePlusPlusOnes,
        TwitterTweets:       temp.TwitterTweets,
        LinkedinShares:      temp.LinkedinShares,
        PinterestPins:       temp.PinterestPins,
        StumbleuponStumbles: temp.StumbleuponStumbles,
        DeliciousBookmarks:  temp.DeliciousBookmarks,
        FacebookLikes:        temp.Facebook.FacebookLikes,
        FacebookShares:       temp.Facebook.FacebookShares,
        FacebookComments:    temp.Facebook.FacebookComments,
        FacebookTotal:       temp.Facebook.FacebookTotal,
    }
    return nil
}</code>
Copier après la connexion

Cette implémentation utilise une structure temporaire (SocialTemp) pour désorganiser initialement les données. Ensuite, il extrait les valeurs aplaties dans la structure sociale souhaitée avant de revenir.

Utilisation d'une fonction utilitaire (recommandée)

Une approche alternative consiste à utiliser une fonction utilitaire comme Flatten fournie dans la réponse :

<code class="go">func Flatten(m map[string]interface{}) map[string]interface{} {
    o := make(map[string]interface{})
    for k, v := range m {
            switch child := v.(type) {
            case map[string]interface{}:
                    nm := Flatten(child)
                    for nk, nv := range nm {
                            o[k+"."+nk] = nv
                    }
            default:
                    o[k] = v
            }
    }
    return o
}</code>
Copier après la connexion

Vous pouvez appliquer cette fonction utilitaire :

<code class="go">var jsonBlob = []byte(`[
    {"StumbleUpon":0,"Reddit":0,"Facebook":{"commentsbox_count":4691,"click_count":0,"total_count":298686,"comment_count":38955,"like_count":82902,"share_count":176829},"Delicious":0,"GooglePlusOne":275234,"Buzz":0,"Twitter":7346788,"Diggs":0,"Pinterest":40982,"LinkedIn":0}
]`)
var flatJson = Flatten(json.Unmarshal(jsonBlob))</code>
Copier après la connexion

Cela se traduira par une carte aplatie qui contient la structure de données souhaitée.

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