主要观点:Go 1.25 中json包的第二个版本(json/v2)是一个重大更新,有很多破坏性变化,增加了新功能、修复了 API 问题和行为缺陷并提升了性能。
关键信息:
Marshal和Unmarshal基本用法在 v1 和 v2 中相同,如定义Person结构体进行序列化和反序列化示例。- v2 中可直接使用
MarshalWrite和UnmarshalRead,与 v1 的Encoder和Decoder不同,前者不添加换行,后者只读取下一个 JSON 值。 Encoder和Decoder类型已移至新的jsontext包,接口有很大变化,可用于读写 JSON 流。- 新增多个选项用于配置序列化和反序列化函数,如
FormatNilMapAsNull等,v2 支持 v1 中的字段标签并新增一些。 - 自定义序列化使用
Marshaler和Unmarshaler接口基本用法不变,但推荐使用新的MarshalerTo和UnmarshalerFrom接口,还可使用MarshalFunc和UnmarshalFunc函数。 - v2 改变了默认的序列化/反序列化行为,如处理 nil 切片、映射等,以及字段名匹配等。
- 反序列化性能大幅提升,切换到流式替代方案可获得显著性能提升,如在 k8s OpenAPI 规范中提速约 40 倍。
- 截至 Go 1.25,
json/v2包是实验性的,可通过设置GOEXPERIMENT=jsonv2启用,且会使 v1 的json包使用新的 JSON 实现。
重要细节:
- 示例代码展示了各种功能的使用方法,包括序列化和反序列化不同类型的数据、使用选项配置、自定义序列化器等。
- 提及了相关的文档链接、性能测试仓库(
jsonbench)以及学习更多关于 v2 设计和实现的链接。 - 最后提醒订阅以获取新文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。