Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Memanjangkan Struktur Go Tidak Diketahui dengan Medan JSON Arbitrari?

Bagaimana untuk Memanjangkan Struktur Go Tidak Diketahui dengan Medan JSON Arbitrari?

DDD
Lepaskan: 2025-01-03 20:32:41
asal
290 orang telah melayarinya

How to Extend Unknown Go Structs with Arbitrary JSON Fields?

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())
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan