Go 中 JSON 的部分解码和更新
在处理 JSON 数据时,通常需要在没有对象完整结构的情况下访问和修改特定值。 Go 中的encoding/json 包虽然提供了强大的解码和编码功能,但会截断或忽略目标结构中未明确定义的字段。这可能会导致重新编码时丢失未知信息。
解决方案:使用 json.RawMessage
为了克服这一挑战,可以利用常规结构体和 json 的组合。 RawMessage实现部分解码和更新。 json.RawMessage 表示原始 JSON 数据,允许保存任何 JSON 结构而无需解码其特定形式。
在下面的代码片段中,Color 结构体是使用 Space 字段和类型为 map[ 的原始字段定义的字符串]json.RawMessage。这样可以存储整个 JSON 对象,同时仅显式解组已知字段 (Space)。
type Color struct { Space string raw map[string]json.RawMessage }
解组和更新
在解组过程中,UnmarshalJSON 方法提取 Space 字段来自原始数据(如果存在)。完整的原始数据存储在原始地图中。
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 }
更新值时,仅需要修改已知字段。在这种情况下,可以为 color.Space 分配一个新值。
编组
编组期间,MarshalJSON 方法检索更新的空间值并将其存储为 json.RawMessage 之前的原始映射中将整个对象编码为 JSON。
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 对象的部分解码和更新:
before := []byte(`{"Space": "YCbCr", "Point": {"Y": 255, "Cb": 0, "Cr": -10}}`) // Decode color := new(Color) err := json.Unmarshal(before, color) // Modify the Space field color.Space = "RGB" // Encode after, err := json.Marshal(color)
输出将是:
{"Point":{"Y":255,"Cb":0,"Cr":-10},"Space":"RGB"}
这种方法保留了未知的结构和信息,允许部分解码和更新JSON 对象。
以上是如何在Go中部分解码和更新JSON数据而不丢失未知信息?的详细内容。更多信息请关注PHP中文网其他相关文章!

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

本文讨论了通过go.mod,涵盖规范,更新和冲突解决方案管理GO模块依赖关系。它强调了最佳实践,例如语义版本控制和定期更新。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver Mac版
视觉化网页开发工具

Dreamweaver CS6
视觉化网页开发工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中