Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Memanjangkan Output JSON dengan Struktur Tidak Diketahui dalam Go?

Bagaimanakah Saya Boleh Memanjangkan Output JSON dengan Struktur Tidak Diketahui dalam Go?

Barbara Streisand
Lepaskan: 2024-12-04 05:29:10
asal
819 orang telah melayarinya

How Can I Extend JSON Output with Unknown Structs in Go?

Melanjutkan Output JSON dengan Struktur Tidak Diketahui

Gambaran Keseluruhan Masalah

Menambah medan sewenang-wenangnya pada output JSON boleh dicapai dengan memanjangkan struct dikenali secara tanpa nama. Walau bagaimanapun, pendekatan ini terhad apabila berurusan dengan struct atau antara muka yang tidak diketahui. Artikel ini meneroka penyelesaian kepada cabaran ini.

Penyelesaian 1: Penjanaan Jenis Dinamik menggunakan Refleksi

Satu penyelesaian melibatkan penjanaan jenis dinamik pada masa jalan menggunakan pakej reflect. Jenis baharu ini ialah struct dengan medan tanpa nama bagi jenis antara muka yang dibalut dan medan tambahan untuk nilai tambahan. Dengan memikirkan nilai dan menetapkan medan dengan sewajarnya, kita boleh memperoleh output JSON yang diingini.

func printInterface(val interface{}) {
    // Create a new struct type with anonymous field for the interface
    t2 := reflect.StructOf([]reflect.StructField{
        {Name: "X", Anonymous: true, Type: reflect.TypeOf(val)},
        {Name: "Extra", Type: reflect.TypeOf("")},
    })

    // Create a new value of the dynamic type
    v2 := reflect.New(t2).Elem()
    // Set the value of the anonymous field to the input interface
    v2.Field(0).Set(reflect.ValueOf(val))
    // Set the extra field to the desired value
    v2.FieldByName("Extra").SetString("text")

    json.NewEncoder(os.Stdout).Encode(v2.Interface())
}
Salin selepas log masuk

Penyelesaian 2: Marshaling dan Unmarshaling

Sebagai alternatif, kita boleh marshal nilai ke JSON, unmarshal ke dalam peta, tambah medan tambahan dan marshal hasilnya sekali lagi.

func printInterface(val interface{}) error {
    // Marshal the value 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
    v2["Extra"] = "text"

    // Marshal the map to JSON
    return json.NewEncoder(os.Stdout).Encode(v2)
}
Salin selepas log masuk

Perbandingan Penyelesaian

Penyelesaian berasaskan pantulan menjana jenis baharu khusus untuk antara muka yang diberikan, menghasilkan pendekatan yang lebih disesuaikan dan berpotensi lebih pantas . Penyelesaian marshaling dan unmarshaling adalah lebih mudah tetapi lebih perlahan kerana langkah marshaling tambahan. Susunan medan dalam output JSON juga mungkin berbeza dalam pendekatan yang terakhir.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanjangkan Output JSON dengan 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