Menemui data JSON dengan kunci yang tidak diketahui dan struktur bersarang yang rumit boleh menjadi tugas yang sukar. Pertimbangkan format JSON berikut:
{ "message": { "Server1.example.com": [ { "application": "Apache", "host": { "name": "/^Server-[13456]/" }, "owner": "User1", "project": "Web", "subowner": "User2" } ], "Server2.example.com": [ { "application": "Mysql", "host": { "name": "/^Server[23456]/" }, "owner": "User2", "project": "DB", "subowner": "User3" } ] }, "response_ms": 659, "success": true }
Seperti yang digambarkan dalam contoh ini, nama pelayan (Pelayan[0-9].example.com) tidak ditentukan dan boleh berbeza-beza. Selain itu, medan berikut nama pelayan tidak mempunyai kunci yang jelas.
Untuk menangkap data ini dengan berkesan, kami boleh menggunakan struktur peta[rentetan]ServerStruct:
type YourStruct struct { Success bool ResponseMS int Servers map[string]*ServerStruct } type ServerStruct struct { Application string Owner string [...] }
Dengan menggabungkan struktur ini, kami mendayakan peruntukan nama pelayan yang tidak diketahui ke dalam peta.
Untuk lebih cemerlang dalam menghapuskan JSON, pertimbangkan untuk menambah teg JSON yang diperlukan:
import "encoding/json" // YourStruct contains the JSON structure with success, response time, and a map of servers type YourStruct struct { Success bool ResponseMS int `json:"response_ms"` Servers map[string]*ServerStruct `json:"message"` } // ServerStruct holds server information, including application, owner, etc. type ServerStruct struct { Application string `json:"application"` Owner string `json:"owner"` [...] } // UnmarshalJSON is a custom unmarshaller that handles nesting and unknown keys func (s *YourStruct) UnmarshalJSON(data []byte) error { type YourStructHelper struct { Success bool ResponseMS int `json:"response_ms"` Servers map[string]ServerStruct `json:"message"` } var helper YourStructHelper if err := json.Unmarshal(data, &helper); err != nil { return err } s.Success = helper.Success s.ResponseMS = helper.ResponseMS s.Servers = make(map[string]*ServerStruct) for k, v := range helper.Servers { s.Servers[k] = &v // Explicitly allocate memory for each server } return nil }
Dengan pelarasan ini, anda boleh mengeluarkan JSON yang disediakan dengan berkesan ke dalam struktur tersuai anda, membuka jalan untuk manipulasi data yang mudah.
Atas ialah kandungan terperinci Bagaimana untuk Unmarshal Nested JSON dengan Kunci Tidak Diketahui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!