首页 > 后端开发 > Golang > 如何在 Go 中部分解码和更新 JSON,同时保留未知字段?

如何在 Go 中部分解码和更新 JSON,同时保留未知字段?

Patricia Arquette
发布: 2024-12-31 10:28:10
原创
523 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板