Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können wir verschachtelte JSON-Antworten in Go reduzieren?

Wie können wir verschachtelte JSON-Antworten in Go reduzieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 16:22:29393Durchsuche

How Can We Flatten Nested JSON Responses in Go?

Reduzieren verschachtelter JSON-Antworten in Go

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.

Benutzerdefiniertes UnmarshalJSON implementieren

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.

Verwendung einer Dienstprogrammfunktion (empfohlen)

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn