Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menambah Medan Arbitrari pada Output JSON bagi Struktur Tidak Diketahui dalam Go?

Bagaimana untuk Menambah Medan Arbitrari pada Output JSON bagi Struktur Tidak Diketahui dalam Go?

Linda Hamilton
Lepaskan: 2024-12-29 17:47:10
asal
438 orang telah melayarinya

How to Add Arbitrary Fields to the JSON Output of an Unknown Struct in Go?

Menambah Medan Arbitrari pada Output JSON bagi Struktur Tidak Diketahui

Pengenalan

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.

Masalah: Membenamkan Jenis Tidak 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)
}
Salin selepas log masuk

Kod ini menghasilkan output JSON berikut:

{"example":{"Name":"name"},"Extra":"text"}
Salin selepas log masuk

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.

Menjana Jenis Struktur Secara Dinamik

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

Kod ini menghasilkan output JSON yang dikehendaki:

{"Name":"name","Extra":"text"}
Salin selepas log masuk

Marshaling Twice

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan