Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Unmarshal Dynamic JSON dalam Go Berdasarkan Kunci Jenis Tanpa Medan Generik?

Bagaimana untuk Unmarshal Dynamic JSON dalam Go Berdasarkan Kunci Jenis Tanpa Medan Generik?

Patricia Arquette
Lepaskan: 2024-12-19 10:49:12
asal
321 orang telah melayarinya

How to Unmarshal Dynamic JSON in Go Based on a Type Key Without Generic Fields?

Menyahmarshaling Dynamic JSON Berdasarkan Kunci Jenis Tanpa Memperkenalkan Medan Generik

Banyak data JSON berstruktur memerlukan unmarshalling ke dalam struct Go, selalunya mengandungi medan bersarang dengan jenis data yang berbeza-beza. Apabila jenis data medan bersarang berbeza-beza berdasarkan kunci jenis dalam JSON, kaedah konvensional unmarshalling menggunakan medan tersuai boleh membawa kepada kod boilerplate yang tidak diperlukan.

Dalam konteks ini, mari pertimbangkan spesifikasi JSON berikut:

{
  "some_data": "foo",
  "dynamic_field": { "type": "A", "name": "Johnny" },
  "other_data": "bar"
}
Salin selepas log masuk

dan

{
  "some_data": "foo",
  "dynamic_field": { "type": "B", "address": "Somewhere" },
  "other_data": "bar"
}
Salin selepas log masuk

Kedua-dua dokumen JSON ini hendaklah unmarshalled ke dalam struct Go yang sama:

type BigStruct struct {
  SomeData     string    `json:"some_data"`
  DynamicField Something `json:"dynamic_field"`
  OtherData    string    `json:"other_data"`
}
Salin selepas log masuk

Cabarannya terletak pada mentakrifkan jenis 'Sesuatu' yang boleh menampung data dinamik berdasarkan kekunci 'type' dalam objek 'dynamic_field'.

Untuk mengelakkan keperluan untuk medan 'generik' eksplisit (cth., Nilai, Data), kami boleh memanfaatkan kuasa pembenaman jenis dan antara muka.

type BigStruct struct {
  SomeData     string      `json:"some_data"`
  DynamicField DynamicType `json:"dynamic_field"`
  OtherData    string      `json:"other_data"`
}

type DynamicType struct {
  Value interface{}
}
Salin selepas log masuk

Dalam 'DynamicType', medan 'Nilai' boleh menyimpan sebarang jenis data, berdasarkan kekunci 'jenis' dalam JSON. Untuk memudahkan unmarshalling yang betul, kami melaksanakan kaedah UnmarshalJSON pada 'DynamicType':

func (d *DynamicType) UnmarshalJSON(data []byte) error {
    var typ struct {
        Type string `json:"type"`
    }
    if err := json.Unmarshal(data, &typ); err != nil {
        return err
    }
    switch typ.Type {
    case "A":
        d.Value = new(TypeA)
    case "B":
        d.Value = new(TypeB)
    }
    return json.Unmarshal(data, d.Value)
}
Salin selepas log masuk

Kami menentukan jenis khusus untuk jenis data yang berbeza:

type TypeA struct {
    Name string `json:"name"`
}

type TypeB struct {
    Address string `json:"address"`
}
Salin selepas log masuk

Dengan pendekatan ini, kami boleh nyahmarshal dokumen JSON tanpa memerlukan medan generik tambahan, membolehkan kami mengekalkan data yang bersih dan boleh diperluaskan struktur.

Atas ialah kandungan terperinci Bagaimana untuk Unmarshal Dynamic JSON dalam Go Berdasarkan Kunci Jenis Tanpa Medan Generik?. 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