Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Unmarshal Dynamic JSON dengan Kunci Jenis Terbenam dalam Go?

Bagaimana untuk Unmarshal Dynamic JSON dengan Kunci Jenis Terbenam dalam Go?

Susan Sarandon
Lepaskan: 2024-12-08 01:48:16
asal
544 orang telah melayarinya

How to Unmarshal Dynamic JSON with an Embedded Type Key in Go?

Menyahmarshaling Dynamic JSON dengan Embedded Type Key

Dalam Go, menyahmarshaling data JSON ke dalam struct dengan medan jenis dinamik boleh mencabar. Artikel ini meneroka penyelesaian yang memanfaatkan struktur tersuai dan kunci jenis terbenam untuk mencapainya.

Pernyataan Masalah

Pertimbangkan struktur JSON berikut:

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

Kami ingin menyahmarshal JSON ini menjadi struct Go yang mempunyai medan DynamicField jenis antara muka Sesuatu. Bergantung pada nilai kekunci jenis dalam JSON, DynamicField harus sepadan dengan sama ada DynamicTypeA atau DynamicTypeB.

Penyelesaian

Untuk menyelesaikan masalah ini, kami mentakrifkan tersuai berikut structs:

type Something interface {
  GetType() string
}

type DynamicType struct {
  Type   string      `json:"type"`
  Value  interface{} `json:"-"` // Not exported
}
Salin selepas log masuk

DynamicType mewakili medan dinamik, dengan kekunci Jenis dibenamkan untuk menentukan jenis data sebenar. Medan Nilai tidak dieksport untuk menghalang akses terus.

Seterusnya, kami mentakrifkan struct Go untuk mewakili JSON:

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

Akhir sekali, kami melaksanakan kaedah UnmarshalJSON untuk 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(DynamicTypeA)
  case "B":
    d.Value = new(DynamicTypeB)
  }
  return json.Unmarshal(data, d.Value)
}
Salin selepas log masuk

Kaedah ini menyahmarshal kekunci jenis dan kemudian mencipta struct yang sesuai (DynamicTypeA atau DynamicTypeB) berdasarkan nilai. Ia kemudian menyahmarshal baki data JSON ke dalam struct yang dicipta, yang kemudiannya disimpan dalam medan Nilai.

Atas ialah kandungan terperinci Bagaimana untuk Unmarshal Dynamic JSON dengan Kunci Jenis Terbenam 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