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