Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menambah Medan Arbitrari pada Output JSON untuk Unknown Go Structs?

Bagaimanakah Saya Boleh Menambah Medan Arbitrari pada Output JSON untuk Unknown Go Structs?

Patricia Arquette
Lepaskan: 2024-12-16 06:10:10
asal
699 orang telah melayarinya

How Can I Add Arbitrary Fields to JSON Output for Unknown Go Structs?

Melanjutkan Output JSON untuk Struktur Tidak Diketahui

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

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

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!

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