Bei der Arbeit mit JSON-Daten stößt man häufig auf verschachtelte Strukturen. Diese hierarchische Organisation kann zwar für Klarheit sorgen, sie kann jedoch auch den effizienten Zugriff auf bestimmte Daten erschweren. Um diesen Prozess zu vereinfachen, kann es von Vorteil sein, verschachtelte JSON-Antworten zu reduzieren.
Um verschachtelte JSON-Antworten in Go zu reduzieren, besteht ein Ansatz darin, eine benutzerdefinierte UnmarshalJSON-Funktion für den gewünschten Strukturtyp zu implementieren . Mit dieser Funktion können Sie den Unmarshaling-Prozess verwalten und die Daten entsprechend umwandeln.
Im bereitgestellten Go-Code stellt eine Social-Struktur das gewünschte abgeflachte Format dar:
<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>
Zum Abflachen des verschachtelten Facebook Daten können Sie die UnmarshalJSON-Funktion wie folgt implementieren:
<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>
Diese Implementierung verwendet eine temporäre Struktur (SocialTemp), um die Daten zunächst zu entmarshalieren. Anschließend werden die abgeflachten Werte vor der Rückgabe in die gewünschte soziale Struktur extrahiert.
Ein alternativer Ansatz besteht darin, eine Dienstprogrammfunktion wie Flatten zu verwenden, die in der Antwort bereitgestellt wird:
<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>
Sie können diese Hilfsfunktion anwenden:
<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>
Dies führt zu einer abgeflachten Karte, die die gewünschte Datenstruktur enthält.
Das obige ist der detaillierte Inhalt vonWie können wir verschachtelte JSON-Antworten in Go reduzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!