Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyahkod Separa dan Mengemas kini Objek JSON dalam Go?

Bagaimana untuk Menyahkod Separa dan Mengemas kini Objek JSON dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-25 00:29:16850semak imbas

How to Partially Decode and Update JSON Objects in 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!

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