Maison  >  Article  >  développement back-end  >  Comment pouvons-nous aplatir les réponses JSON imbriquées dans Go ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 16:22:29393parcourir

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>

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>

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>

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>

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!

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