Bagaimanakah Kami Boleh Meratakan Respons JSON Bersarang dalam Go?

Patricia Arquette
Lepaskan: 2024-10-27 16:22:29
asal
491 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan