Go 中的 JSON 演进:从 v1 到 v2

主要观点:Go 1.25 中json包的第二个版本(json/v2)是一个重大更新,有很多破坏性变化,增加了新功能、修复了 API 问题和行为缺陷并提升了性能。

关键信息

  • MarshalUnmarshal基本用法在 v1 和 v2 中相同,如定义Person结构体进行序列化和反序列化示例。
  • v2 中可直接使用MarshalWriteUnmarshalRead,与 v1 的EncoderDecoder不同,前者不添加换行,后者只读取下一个 JSON 值。
  • EncoderDecoder类型已移至新的jsontext包,接口有很大变化,可用于读写 JSON 流。
  • 新增多个选项用于配置序列化和反序列化函数,如FormatNilMapAsNull等,v2 支持 v1 中的字段标签并新增一些。
  • 自定义序列化使用MarshalerUnmarshaler接口基本用法不变,但推荐使用新的MarshalerToUnmarshalerFrom接口,还可使用MarshalFuncUnmarshalFunc函数。
  • v2 改变了默认的序列化/反序列化行为,如处理 nil 切片、映射等,以及字段名匹配等。
  • 反序列化性能大幅提升,切换到流式替代方案可获得显著性能提升,如在 k8s OpenAPI 规范中提速约 40 倍。
  • 截至 Go 1.25,json/v2包是实验性的,可通过设置GOEXPERIMENT=jsonv2启用,且会使 v1 的json包使用新的 JSON 实现。

重要细节

  • 示例代码展示了各种功能的使用方法,包括序列化和反序列化不同类型的数据、使用选项配置、自定义序列化器等。
  • 提及了相关的文档链接、性能测试仓库(jsonbench)以及学习更多关于 v2 设计和实现的链接。
  • 最后提醒订阅以获取新文章。
阅读 179
0 条评论