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中文網其他相關文章!