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
Patricia Arquetteasal
2024-12-19 10:49:12367semak imbas

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"
}

dan

{
  "some_data": "foo",
  "dynamic_field": { "type": "B", "address": "Somewhere" },
  "other_data": "bar"
}

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"`
}

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{}
}

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

Kami menentukan jenis khusus untuk jenis data yang berbeza:

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

type TypeB struct {
    Address string `json:"address"`
}

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!

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