Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menambah Medan Arbitrari pada Output JSON untuk Unknown Go Structs?
Masalah:
Apabila berurusan dengan struct atau antara muka yang tidak diketahui, menambah medan sewenang-wenangnya ke Output JSON boleh mencabar. Kod yang ditunjukkan menunjukkan isu ini. Bagaimanakah kita boleh meniru keluaran JSON yang dikehendaki untuk struktur yang tidak diketahui?
Penyelesaian 1: Penjanaan Jenis Dinamik menggunakan Refleksi
Satu pendekatan melibatkan penggunaan pantulan untuk menghasilkan jenis dinamik pada masa jalan . Jenis ini ialah struct dengan medan tanpa nama bagi jenis antara muka yang dibalut dan medan tambahan. Dengan memanipulasi jenis dinamik ini, kita boleh mencapai output JSON yang diingini.
func printInterface(val interface{}) { t2 := reflect.StructOf([]reflect.StructField{ {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)}, {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()) }
Penyelesaian 2: Marshal-Unmarshal-Marshal
Penyelesaian alternatif melibatkan penggabungan input nilai, membongkarnya ke dalam peta, menambah medan tambahan dan menyusunnya sekali lagi.
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) }
Kedua-dua penyelesaian membenarkan kami menambah medan sewenang-wenangnya pada output JSON untuk struktur yang tidak diketahui. Penyelesaian pertama adalah lebih canggih dan menawarkan kawalan yang lebih baik, manakala penyelesaian kedua adalah lebih mudah tetapi kurang berprestasi kerana dwi marshalling. Akhirnya, pilihan penyelesaian bergantung pada keperluan khusus dan keutamaan kes penggunaan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menambah Medan Arbitrari pada Output JSON untuk Unknown Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!