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
Patricia Arquetteasal
2024-12-16 06:10:10702semak imbas

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())
}

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!

Kenyataan:
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