首頁 > 後端開發 > Golang > 如何在 Go 中間分解碼和更新 JSON,同時保留未知欄位?

如何在 Go 中間分解碼和更新 JSON,同時保留未知欄位?

Patricia Arquette
發布: 2024-12-31 10:28:10
原創
500 人瀏覽過

How Can I Partially Decode and Update JSON in Go While Preserving Unknown Fields?

Go 中JSON 的部分解碼與更新

使用JSON 物件時,可能需要僅解碼特定值,同時保留未知值物件的一部分。然而,Go 中的encoding/json 套件往往會截斷結構體中不存在的字段,從而導致重新編碼時資料遺失。

為了克服這個問題,可以使用簡單的結構和json.RawMessage 的組合來保存未知的fields.

type Color struct {
    Space string
    raw   map[string]json.RawMessage
}
登入後複製

在此結構中,原始欄位將整個JSON 物件儲存為RawMessage。解碼時,UnmarshalJSON 方法讀取原始字段,將特定值提取到結構體的定義字段中。

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
}
登入後複製

同樣,編碼時,MarshalJSON 方法序列化Space 欄位並使用編碼位元組更新原始映射.

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)
}
登入後複製

這種方法允許對特定欄位進行部分解碼和更新,同時保留JSON 的未知部分物件。

以上是如何在 Go 中間分解碼和更新 JSON,同時保留未知欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板