處理 JSON 資料時,常會遇到巢狀結構。雖然這種分層組織可以提供清晰度,但也可能使有效存取特定資料變得困難。為了簡化此過程,扁平化巢狀 JSON 回應可能會很有幫助。
要在 Go 中扁平化巢狀 JSON 回應,一種方法是為所需的結構類型實作自訂 UnmarshalJSON 函數。此函數可讓您處理解群組過程並相應地轉換資料。
在提供的Go 程式碼中,Social 結構代表所需的扁平化格式:
<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>
扁平化巢狀的Facebook數據,您可以如下實作UnmarshalJSON 函數:
<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>
此實作使用臨時結構(SocialTemp) 來最初解組資料。然後,它在返回之前將扁平化的值提取到所需的社交結構中。
另一種方法是利用答案中提供的實用函數,例如Flatten:
<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>
您可以應用此實用函數:
<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>
這將產生包含所需資料結構的扁平化地圖。
以上是我們如何在 Go 中展平嵌套的 JSON 回應?的詳細內容。更多資訊請關注PHP中文網其他相關文章!