Menyahmarshaling Dynamic JSON Berdasarkan Kunci Jenis Tanpa Memperkenalkan Medan Generik
Banyak data JSON berstruktur memerlukan unmarshalling ke dalam struct Go, selalunya mengandungi medan bersarang dengan jenis data yang berbeza-beza. Apabila jenis data medan bersarang berbeza-beza berdasarkan kunci jenis dalam JSON, kaedah konvensional unmarshalling menggunakan medan tersuai boleh membawa kepada kod boilerplate yang tidak diperlukan.
Dalam konteks ini, mari pertimbangkan spesifikasi JSON berikut:
{ "some_data": "foo", "dynamic_field": { "type": "A", "name": "Johnny" }, "other_data": "bar" }
dan
{ "some_data": "foo", "dynamic_field": { "type": "B", "address": "Somewhere" }, "other_data": "bar" }
Kedua-dua dokumen JSON ini hendaklah unmarshalled ke dalam struct Go yang sama:
type BigStruct struct { SomeData string `json:"some_data"` DynamicField Something `json:"dynamic_field"` OtherData string `json:"other_data"` }
Cabarannya terletak pada mentakrifkan jenis 'Sesuatu' yang boleh menampung data dinamik berdasarkan kekunci 'type' dalam objek 'dynamic_field'.
Untuk mengelakkan keperluan untuk medan 'generik' eksplisit (cth., Nilai, Data), kami boleh memanfaatkan kuasa pembenaman jenis dan antara muka.
type BigStruct struct { SomeData string `json:"some_data"` DynamicField DynamicType `json:"dynamic_field"` OtherData string `json:"other_data"` } type DynamicType struct { Value interface{} }
Dalam 'DynamicType', medan 'Nilai' boleh menyimpan sebarang jenis data, berdasarkan kekunci 'jenis' dalam JSON. Untuk memudahkan unmarshalling yang betul, kami melaksanakan kaedah UnmarshalJSON pada 'DynamicType':
func (d *DynamicType) UnmarshalJSON(data []byte) error { var typ struct { Type string `json:"type"` } if err := json.Unmarshal(data, &typ); err != nil { return err } switch typ.Type { case "A": d.Value = new(TypeA) case "B": d.Value = new(TypeB) } return json.Unmarshal(data, d.Value) }
Kami menentukan jenis khusus untuk jenis data yang berbeza:
type TypeA struct { Name string `json:"name"` } type TypeB struct { Address string `json:"address"` }
Dengan pendekatan ini, kami boleh nyahmarshal dokumen JSON tanpa memerlukan medan generik tambahan, membolehkan kami mengekalkan data yang bersih dan boleh diperluaskan struktur.
Atas ialah kandungan terperinci Bagaimana untuk Unmarshal Dynamic JSON dalam Go Berdasarkan Kunci Jenis Tanpa Medan Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!