Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Kami Boleh Meratakan Respons JSON Bersarang dalam Go?

Bagaimanakah Kami Boleh Meratakan Respons JSON Bersarang dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 16:22:29492semak imbas

How Can We Flatten Nested JSON Responses in Go?

Meratakan Respons JSON Bersarang dalam Go

Apabila bekerja dengan data JSON, adalah perkara biasa untuk menghadapi struktur bersarang. Walaupun organisasi hierarki ini boleh memberikan kejelasan, ia juga boleh menjadikannya mencabar untuk mengakses data tertentu dengan cekap. Untuk memudahkan proses ini, meratakan respons JSON bersarang boleh memberi manfaat.

Melaksanakan UnmarshalJSON Tersuai

Untuk meratakan respons JSON bersarang dalam Go, satu pendekatan ialah melaksanakan fungsi UnmarshalJSON tersuai untuk jenis struct yang diingini . Fungsi ini membolehkan anda mengendalikan proses unmarshaling dan mengubah data dengan sewajarnya.

Dalam kod Go yang disediakan, struct Sosial mewakili format rata yang diingini:

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

Untuk meratakan Facebook bersarang data, anda boleh melaksanakan fungsi UnmarshalJSON seperti berikut:

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

Pelaksanaan ini menggunakan struct sementara (SocialTemp) untuk menyahmarshal data pada mulanya. Kemudian, ia mengekstrak nilai yang diratakan ke dalam struct Sosial yang dikehendaki sebelum kembali.

Menggunakan Fungsi Utiliti (Disyorkan)

Pendekatan alternatif ialah menggunakan fungsi utiliti seperti Flatten yang disediakan dalam jawapan:

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

Anda boleh menggunakan fungsi utiliti ini:

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

Ini akan menghasilkan peta diratakan yang mengandungi struktur data yang dikehendaki.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Meratakan Respons JSON Bersarang dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn