Banyak soalan yang sama telah ditanya mengenai unmarshalling JSON dengan pasangan kunci/nilai yang tidak diketahui/arbitrari ke dalam struct. Walau bagaimanapun, tiada penyelesaian yang ditemui menyediakan kaedah yang mudah dan elegan untuk mencapainya.
Kami mempunyai rentetan JSON yang mengandungi medan yang diketahui (sentiasa ada) dan bilangan yang tidak diketahui/ bidang sewenang-wenangnya. Contoh:
<code class="json">{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}</code>
Dalam contoh ini, known1 dan known2 ialah medan yang diketahui, manakala unknown1 dan unknown2 ialah medan arbitrari. Medan yang tidak diketahui boleh mempunyai sebarang nama (kunci) dan nilai (rentetan, bool, float64, atau int).
Matlamat kami ialah mencari cara idiomatik untuk menghuraikan mesej JSON sedemikian ke dalam struct.
Kita boleh mentakrifkan struct berikut:
<code class="go">type Message struct { Known1 string `json:"known1"` Known2 string `json:"known2"` Unknowns []map[string]interface{} }</code>
Dengan struct ini, sampel mesej JSON harus menghasilkan hasil berikut:
{Known1:foo Known2:bar Unknowns:[map[unknown1:car] map[unknown2:1]]}
Pilihan lain ialah menyahmarshal JSON ke dalam peta[rentetan]antara muka{}:
<code class="go">import ( "encoding/json" "fmt" ) func main() { jsonMsg := `{"known1": "foo", "known2": "bar", "unknown1": "car", "unknown2": 1}` var msg map[string]interface{} fmt.Println(json.Unmarshal([]byte(jsonMsg), &msg)) fmt.Printf("%+v", msg) }</code>
Ini akan menghasilkan:
<nil> map[known1:foo known2:bar unknown1:car unknown2:1]
Kelebihan daripada pendekatan ini ialah kita boleh mengulangi kekunci dan nilai dan melaksanakan penegasan jenis yang diperlukan untuk mengendalikan data. Kami mungkin atau mungkin tidak mengisi struct dengan data bergantung pada keperluan kami.
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal JSON dengan Pasangan Kunci/Nilai Arbitrari ke dalam Struct in Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!