Memahami cara menyahmarshal JSON ke dalam antara muka{} ialah kemahiran penting untuk pembangun Go. Dalam artikel ini, kita akan menelusuri contoh praktikal yang menyerlahkan perangkap dan penyelesaian yang dikaitkan dengan membongkar JSON ke dalam struct dengan medan{} antara muka.
Pertimbangkan definisi jenis berikut:
type Message struct { Cmd string `json:"cmd"` Data interface{} `json:"data"` } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Memandangkan rentetan JSON yang mewakili mesej cipta, kami mungkin cuba menyahkodnya menjadi Mesej struct:
{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
import "encoding/json" var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`) var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) }
Setelah meneliti struct Message unmarshaled, kami mendapati bahawa medan Data kekal sebagai peta[rentetan]antara muka{}:
{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
Untuk mengatasi had ini, kami menggunakan serampang dua mata pendekatan:
type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Dengan pengubahsuaian ini, kita boleh menyahkod data varian ke dalam jenis struct yang sesuai berdasarkan arahan:
func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }
Dengan menggunakan teknik ini, kita boleh berjaya menyahmarshal data JSON ke dalam struct Message, di mana medan Data mengandungi jenis CreateMessage varian. Rujuk contoh taman permainan yang disediakan untuk pelaksanaan lengkap.
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal JSON ke Antara Muka{} dengan Berkesan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!