Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menyahkod Separa dan Mengemas kini Data JSON dalam Go Tanpa Kehilangan Maklumat Tidak Diketahui?
Apabila bekerja dengan data JSON, selalunya perlu untuk mengakses dan mengubah suai nilai tertentu tanpa mempunyai struktur penuh objek . Pakej pengekodan/json dalam Go, sambil menyediakan keupayaan penyahkodan dan pengekodan yang mantap, memotong atau mengabaikan medan yang tidak ditakrifkan secara eksplisit dalam struct destinasi. Ini boleh menyebabkan kehilangan maklumat yang tidak diketahui semasa pengekodan semula.
Untuk mengatasi cabaran ini, adalah mungkin untuk memanfaatkan gabungan struct biasa dan json. RawMessage untuk mencapai penyahkodan separa dan pengemaskinian. json.RawMessage mewakili data JSON mentah, membenarkan mana-mana struktur JSON dipegang tanpa menyahkod bentuk khususnya.
Dalam coretan kod berikut, struct Warna ditakrifkan dengan medan Ruang dan medan mentah jenis peta[ string]json.RawMessage. Ini membolehkan penyimpanan keseluruhan objek JSON sambil menyahmarshaling secara eksplisit hanya medan yang diketahui (Space).
type Color struct { Space string raw map[string]json.RawMessage }
Semasa proses unmarshaling, kaedah UnmarshalJSON mengekstrak medan Space daripada data mentah, jika ada. Data mentah yang lengkap disimpan dalam peta mentah.
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 }
Apabila mengemas kini nilai, hanya medan yang diketahui perlu diubah suai. Dalam kes ini, color.Space boleh diberikan nilai baharu.
Semasa marshaling, kaedah MarshalJSON mendapatkan semula nilai ruang yang dikemas kini dan menyimpannya sebagai json.RawMessage dalam peta mentah sebelum pengekodan keseluruhan objek sebagai JSON.
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) }
Contoh berikut menunjukkan penyahkodan separa dan pengemaskinian objek JSON:
before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) // Decode color := new(Color) err := json.Unmarshal(before, color) // Modify the Space field color.Space = "RGB" // Encode after, err := json.Marshal(color)
Outputnya ialah:
{"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
Pendekatan ini mengekalkan struktur yang tidak diketahui dan maklumat, membenarkan penyahkodan separa dan mengemas kini objek JSON.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyahkod Separa dan Mengemas kini Data JSON dalam Go Tanpa Kehilangan Maklumat Tidak Diketahui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!