Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Kami Boleh 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.
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.
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!