Membenamkan struct sebagai penutupan tanpa nama ialah pendekatan biasa untuk menambahkan medan tambahan pada JSON keluaran. Walau bagaimanapun, teknik ini terhad kepada situasi di mana jenis struct diketahui.
Apabila berurusan dengan struct atau antara muka sewenang-wenangnya, pendekatan pembenaman tradisional gagal. Pertimbangkan kod berikut:
type example interface{} type Data struct { Name string } type Extra struct { Text string } func printInterface(val interface{}) { example1 := struct { example Extra string }{ example: val, Extra: "text", } json.NewEncoder(os.Stdout).Encode(example1) } func main() { d := Data{Name:"name"} printInterface(&d) }
Kod ini menghasilkan output JSON berikut:
{"example":{"Name":"name"},"Extra":"text"}
Seperti yang anda lihat, medan Nama struct Data tidak disertakan dalam output JSON . Ini kerana antara muka tidak mempunyai medan, dan oleh itu medan struct asas tidak dipromosikan.
Satu penyelesaian ialah menjana jenis struct baharu secara dinamik menggunakan pantulan . Struktur ini akan mengandungi medan tanpa nama daripada jenis yang tidak diketahui dan medan tambahan untuk data tambahan.
func printInterface(val interface{}) { t2 := reflect.StructOf([]reflect.StructField{ reflect.StructField{ Name: "X", Anonymous: true, Type: reflect.TypeOf(val), }, reflect.StructField{ Name: "Extra", Type: reflect.TypeOf(""), }, }) v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Kod ini menghasilkan output JSON yang dikehendaki:
{"Name":"name","Extra":"text"}
Alternatif lain ialah menyusun nilai yang tidak diketahui, menyahmarshalkannya ke dalam peta, menambah medan tambahan dan menyusun semula peta itu ke dalam JSON.
func printInterface(val interface{}) error { data, err := json.Marshal(val) if err != nil { return err } v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } v2["Extra"] = "text" return json.NewEncoder(os.Stdout).Encode(v2) }
Penyelesaian ini lebih mudah tetapi mungkin kurang cekap disebabkan oleh proses pemaspalan berganda.
Atas ialah kandungan terperinci Bagaimana untuk Menambah Medan Arbitrari pada Output JSON bagi Struktur Tidak Diketahui dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!