情报报告

Go 1.27 正式发布 JSON 新包:json/v2 与 jsontext 转为稳定版

新的 JSON 包一年前以实验版形式发布,旨在解决 encoding/json 长期存在的正确性、安全性和性能缺陷。

INSIGHTEX Editorial Desk

阅读约 2 分钟

Go 1.27 正式发布 JSON 新包:json/v2 与 jsontext 转为稳定版情报报告

事件经过

据 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 编码为空数组或空对象。

来源Go

简报

一封邮件,尽览一周科技要闻。

每周精选值得一读的报道。可随时退订。