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中文网其他相关文章!