Go 官方发布 JSON 新 API:encoding/json/v2 随 Go 1.27 正式可用
作者:林序
Go 官方博客 11 月 4 日宣布,结束一年实验状态的 encoding/json/v2 与 encoding/json/jsontext 随 Go 1.27 稳定发布,反序列化基准最高快 10 倍,旧包继续获得支持。
Go 官方博客 11 月 4 日发文宣布,去年还是实验特性的 encoding/json/v2 和 encoding/json/jsontext 已经稳定,随 Go 1.27 一起提供 。处理 JSON 的开发者升级后就能用,不必再去找实验开关。
旧包 encoding/json 在 Go 1.0 之前就在标准库里,服役超过 15 年。官方列出的问题都很具体:它接受非法 UTF-8,接受重复字段名(这类歧义曾被利用,如 CVE-2017-12635),反序列化时字段名大小写不敏感,nil 切片和 map 会被写成 null,Decoder 名为流式、实则把整个值读进内存 。
新包拆成两层。jsontext 只处理 JSON 语法,不依赖反射(运行时检查类型的那套机制),可真正流式读写;json/v2 负责 JSON 与 Go 类型之间的转换,选项能直接传给 Marshal、Unmarshal,也能沿调用栈往下传 。
性能方面,官方基准显示序列化与旧版大致持平,反序列化最高快 10 倍;自定义类型改用 MarshalerTo、UnmarshalerFrom 接口收益更大,官方举例说 Kubernetes 某服务提升到数量级差别,Go 1.28 还会继续优化 。
迁移不强制。旧包受 Go 1 兼容承诺保护,可无限期使用,而且底层已改由新包实现,v1 与 v2 能在同一程序里互相调用。多数项目可直接切到 v2;依赖旧行为的项目,官方提供了选项逐项保留 。
转载说明
本文根据以下公开资料整理,原文及配图出处见下方。
评论 0
还没有评论,来抢沙发。