Apabila bekerja dengan data JSON, kadangkala perlu mengubah suai nilai tertentu sahaja tanpa kehilangan struktur sedia ada. Ini boleh mencabar jika anda tidak mengetahui keseluruhan struktur objek JSON kerana pengekodan/pakej json Go memotong medan yang tidak disertakan dalam struct sasaran.
Artikel ini meneroka teknik yang memanfaatkan gabungan struct biasa dan json.RawMessage untuk mencapai penyahkodan separa dan mengemas kini tanpa kehilangan maklumat yang tidak diketahui.
Kunci kepada penyahkodan separa adalah untuk menyimpan keseluruhan data JSON dalam medan mentah (cth., map[string]json.RawMessage) dan secara selektif nyahmarshal medan khusus ke dalam struct anda. Begini caranya:
import "encoding/json" type Color struct { Space string raw map[string]json.RawMessage } func (c *Color) UnmarshalJSON(bytes []byte) error { if err := json.Unmarshal(bytes, &c.raw); err != nil { return err } if space, ok := c.raw["Space"]; ok { if err := json.Unmarshal(space, &c.Space); err != nil { return err } } return nil }
Di sini, UnmarshalJSON mendapatkan semula keseluruhan data JSON ke dalam c.raw, kemudian menyahmarshal medan Angkasa ke dalam c.Space.
Setelah anda menyahkod sebahagian data JSON, anda boleh mengubah suai medan tertentu sebagai diperlukan.
Selepas mengubah suai medan anda yang diketahui, anda perlu menyusun semula struct Warna yang dikemas kini kepada JSON. Untuk mengekalkan struktur sedia ada dan mengelakkan pemotongan, anda menulis kaedah MarshalJSON tersuai anda:
func (c *Color) MarshalJSON() ([]byte, error) { bytes, err := json.Marshal(c.Space) if err != nil { return nil, err } c.raw["Space"] = json.RawMessage(bytes) return json.Marshal(c.raw) }
Dalam MarshalJSON, anda mengawal medan Angkasa yang diubah suai, kemudian membenamkannya semula ke dalam peta mentah sebelum melakukan marshalling terakhir.
Teknik ini membolehkan anda mengubah suai nilai tertentu dalam data JSON tanpa kehilangan maklumat yang tidak diketahui, menjadikan ia sesuai untuk senario di mana struktur JSON penuh tidak tersedia atau tertakluk kepada perubahan.
Atas ialah kandungan terperinci Bagaimana untuk Menyahkod Separa dan Mengemas kini Data JSON dalam Pergi Tanpa Kehilangan Medan Tidak Diketahui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!