Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menyahkod Separa dan Mengemas kini Data JSON dalam Go Tanpa Kehilangan Maklumat Tidak Diketahui?

Bagaimanakah Saya Boleh Menyahkod Separa dan Mengemas kini Data JSON dalam Go Tanpa Kehilangan Maklumat Tidak Diketahui?

Susan Sarandon
Susan Sarandonasal
2024-12-24 13:02:19884semak imbas

How Can I Partially Decode and Update JSON Data in Go Without Losing Unknown Information?

Penyahkodan Separa dan Kemas Kini JSON dalam Go

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.

Penyelesaian: Menggunakan json.RawMessage

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
}

Menyahmarshaling dan Mengemas kini

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.

Marshaling

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 Penggunaan

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!

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