Memperluaskan Struktur Tidak Diketahui dengan Medan JSON Arbitrari
Dalam Go, menambah medan tambahan pada perwakilan JSON bagi struct yang diketahui boleh dicapai menggunakan struct tanpa nama. Walau bagaimanapun, pendekatan ini tidak boleh digunakan apabila berurusan dengan struktur yang tidak diketahui. Artikel ini meneroka cara untuk mencapai kefungsian serupa dalam senario sedemikian.
Pakej Reflect untuk Penjanaan Jenis Dinamik
Satu penyelesaian ialah menggunakan pakej reflect untuk menjana struct tersuai secara dinamik taip semasa runtime. Jenis ini termasuk medan tanpa nama daripada jenis yang sama seperti antara muka yang dibalut dan medan "Tambahan" tambahan. Ini membenarkan promosi medan struct terbenam, membolehkan perwakilan JSON yang betul.
func printInterface(val interface{}) { // Define the new struct type dynamically t2 := reflect.StructOf([]reflect.StructField{ { Name: "X", Anonymous: true, Type: reflect.TypeOf(val), }, { Name: "Extra", Type: reflect.TypeOf(""), }, }) // Create a new instance of the dynamic type v2 := reflect.New(t2).Elem() v2.Field(0).Set(reflect.ValueOf(val)) v2.FieldByName("Extra").SetString("text") // Encode the dynamic type's value to JSON json.NewEncoder(os.Stdout).Encode(v2.Interface()) }
Double Marshalling untuk Medan JSON Arbitrary
Pendekatan alternatif melibatkan penyerikan antara muka, menghuraikan JSON yang terhasil ke dalam peta, menambah medan "Tambahan", dan kemudian mensiri semula peta yang diubah suai kepada JSON. Kaedah ini lebih mudah tetapi mungkin dikenakan penalti prestasi disebabkan oleh beberapa langkah bersiri.
func printInterface(val interface{}) error { // Serialize the interface to JSON data, err := json.Marshal(val) if err != nil { return err } // Unmarshal the JSON into a map v2 := map[string]interface{}{} if err := json.Unmarshal(data, &v2); err != nil { return err } // Add the "Extra" field to the map v2["Extra"] = "text" // Serialize the modified map to JSON return json.NewEncoder(os.Stdout).Encode(v2) }
Kedua-dua kaedah berkesan memanjangkan struct yang tidak diketahui dengan medan "Tambahan" yang dikehendaki dalam perwakilan JSON, memenuhi senario di mana manipulasi struktur langsung tidak boleh dilaksanakan.
Atas ialah kandungan terperinci Bagaimana untuk Memanjangkan Struktur Go Tidak Diketahui dengan Medan JSON Arbitrari?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!