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
Lepaskan: 2024-12-24 13:02:19
asal
901 orang telah melayarinya

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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)
Salin selepas log masuk

Outputnya ialah:

{"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan