Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyahmarshal Rentetan JSON Rujukan Sendiri dalam Go dengan Jenis Dinamik?
Menyahmarshall JSON String ke Struct dengan Elemen Rujukan Kendiri
Dalam Go, menyahmarshall rentetan JSON ke struct dengan self- elemen rujukan boleh mencabar. Mari kita terokai contoh khusus dan penyelesaian untuk menangani isu ini dengan berkesan.
Input JSON dan Definisi Struktur
Pertimbangkan input JSON berikut:
[{ "db": { "url": "mongodb://localhost", "port": "27000", "uname": "", "pass": "", "authdb": "", "replicas": [ { "rs01": { "url":"mongodb://localhost", "port": "27001", "uname": "", "pass": "", "authdb": "" } }, { "rs02": { "url":"mongodb://localhost", "port": "27002", "uname": "", "pass": "", "authdb": "" } } ] } }]
Dan Go yang sepadan struct:
type DBS struct { URL string `json:"url"` Port string `json:"port"` Uname string `json:"uname"` Pass string `json:"pass"` Authdb string `json:"authdb"` Replicas []DBS `json:"replicas"` }
Unmarshal Function and Output
Fungsi yang disediakan, loadConfigs(), cuba unmarshal rentetan JSON ke dalam sekeping struct DBS:
func loadConfigs() []DBS { var config []DBS raw, err := ioutil.ReadFile("./config.json") if err != nil { fmt.Println(err.Error()) os.Exit(1) } json.Unmarshal(raw, &config) return config }
Walau bagaimanapun, ini menghasilkan kepingan kosong, []DBS{, kerana JSON input bukan sekeping struct DBS tetapi pembalut objek JSON yang mengandungi tatasusunan objek.
Penyelesaian: Pemetaan kepada Jenis Dinamik
Untuk menerangkan sepenuhnya input JSON , jenis dinamik seperti peta diperlukan. Takrif jenis yang dikemas kini menjadi:
type DBSReplicated struct { DB *DBS `json:"db"` }
type DBS struct { URL string `json:"url"` Port string `json:"port"` Uname string `json:"uname"` Pass string `json:"pass"` Authdb string `json:"authdb"` Replicas []map[string]*DBS `json:"replicas"` }
Menggunakan jenis baharu ini, kita boleh menghuraikan input JSON dengan tepat:
var dbs []*DBReplicated if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } db := dbs[0].DB fmt.Printf("%+v\n", db) for _, dbs := range db.Replicas { for name, replica := range dbs { fmt.Printf("%s: %+v\n", name, replica) } }
Output
&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]} rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]} rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}
Kunci Mata
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Rentetan JSON Rujukan Sendiri dalam Go dengan Jenis Dinamik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!