Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyahkod Separa dan Mengemas kini Objek JSON dalam Go?
Penyahkodan dan Kemas Kini JSON Separa dalam Go
Dalam senario tertentu, masalah biasa timbul apabila menyahkod dan mengemas kini hanya nilai tertentu objek JSON , terutamanya apabila struktur objek lengkap tidak diketahui. Pakej pengekodan/json standard dalam Go memotong medan yang tidak disediakan dalam struct, membawa kepada kehilangan data.
Penyelesaian menggunakan json.RawMessage
Penyelesaian kepada masalah ini ialah untuk menggabungkan struct tersuai dengan json.RawMessage. Pendekatan ini membolehkan kami mengekalkan keseluruhan data ke dalam medan mentah untuk pengekodan/penyahkodan.
Jenis json.RawMessage dalam Go ialah nilai []bait yang boleh menyimpan data JSON sewenang-wenangnya. Ia berguna untuk kes seperti ini, di mana kita hanya mengetahui sebahagian daripada struktur JSON dan mahu mengekalkan bahagian yang tidak diketahui.
Kod Contoh
package main import ( "encoding/json" "log" ) 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 } 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) } func main() { before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) log.Println("before: ", string(before)) // decode color := new(Color) err := json.Unmarshal(before, color) if err != nil { log.Fatal(err) } // modify fields of interest color.Space = "RGB" // encode after, err := json.Marshal(color) if err != nil { log.Fatal(err) } log.Println("after: ", string(after)) }
Output
before: {"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}} after: {"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
Penyelesaian ini membolehkan kami menyahkod dan mengemas kini hanya nilai tertentu (dalam kes ini, Space) sambil mengekalkan semua data lain yang tidak diketahui dalam objek JSON. Adalah penting untuk ambil perhatian bahawa pendekatan ini tidak mengekalkan susunan utama atau lekukan dalam output.
Atas ialah kandungan terperinci Bagaimana untuk Menyahkod Separa dan Mengemas kini Objek JSON dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!