事件经过
据 Go 官方报道,随着 Go 1.27 的发布,encoding/json/v2 包及其配套的 encoding/json/jsontext 已进入稳定状态,可供一般使用。这篇发布于 2026 年 11 月 4 日的文章共有七位作者,其中包括 Joe Tsai、Damien Neil、Daniel Martí 和 Michael Pratt。此前一年曾推出该 API 的实验版本,并在收集更多反馈后做了改进。
作者表示,原有的 encoding/json 包虽然事实证明相当灵活,但存在用户多年来不断指出的缺陷。它容忍无效的 UTF-8,而 RFC 8259 明令禁止这一点;它还接受含有重复成员名称的对象,攻击者过去曾利用这一弱点,例如 CVE-2017-12635。此外,它在匹配字段名称时不区分大小写,并且会把 nil 切片和 map 编码为 null。
文章指出,这些行为无法在不破坏 Go 1 兼容性承诺的前提下得到纠正。性能方面的限制也是如此,例如将整个值缓冲在内存中,以及当自定义方法递归调用 Marshal 或 Unmarshal 时出现的二次方级减速。新设计将工作一分为二:jsontext 负责处理 JSON 语法,且不依赖反射;json/v2 则负责把 JSON 值映射到 Go 类型。
背景
早在 Go 1.0 之前,Go 的标准库就已提供 JSON 支持,作者称 JSON 是互联网上使用最广泛的数据格式。由于这些问题源于现有 API 本身,他们选择建立单独的 v2 命名空间,而不是在原包内添加 MarshalV2 之类的并行函数。文中引用的一项调查发现,大多数 Go 用户希望把 nil 切片和 map 编码为空数组或空对象。
简报
一封邮件,尽览一周科技要闻。
每周精选值得一读的报道。可随时退订。
