Go 的全新 JSON API - Go 编程语言
BestBlog编程类文章 · 软件开发
📌 One-Sentence Summary 本文宣布 encoding/json/v2 和 encoding/json/jsontext 包将在 Go 1.27 中稳定发布,解决原有 encoding/json 包长期存在的问题,包括 UTF-8 处理、重复键、nil 切片的编组、区分大小写的解组以及性能限制。 📝 Summary Go 博客宣布,encoding/json/v2 和 encoding/json/jsontext 包将在 Go 1.27 中稳定发布,解决原有 encoding/json 包的诸多问题。文章介绍了原包在行为上的缺陷,例如接受无效 UTF-8、允许 JSON 对象中出现重复键、将 nil 切片和映射编组为 null,以及解组时不区分大小写。文章还说明了 API 的不足,包括难以从 io.Reader 解组、选项无法传递,以及工具函数只能处理缓冲区。新版本通过基于流式令牌的 API、新增的 MarshalJSONTo 和 UnmarshalJSONFrom 接口,以及最高可达 10x 的解组性能提升,改善了性能限制。jsontext 包负责语法层面的 JSON 处理,v2 则负责语义层面的编组,从而更好地分离关注点并支持流式处理。 💡 Main Points encoding/json/v2 修复了原包的关键行为缺陷 新版本会正确拒绝无效 UTF-8 和包含重复键的 JSON 对象,并在匹配结构体字段时区分大小写,解决安全漏洞和不符合 RFC 8259 的问题。 全新的 jsontext 包支持流式处理 JSON 令牌 jsontext 包将 JSON 语法处理与语义编组分离,并通过 Encoder/Decoder 类型实现真正的流式处理。这些类型可与 io.Writer/io.Reader 配合使用,无需将整个 JSON 值缓冲到内存中。 通过流式接口提升性能 新增的 MarshalJSONTo 和 UnmarshalJSONFrom 接口支持自定义类型以流式方式处理 JSON,避免重复解析,并使解组性能最高提升 10x。 通过选项和调用方指定的自定义处理增强 API 灵活性 选项现在是编组和解组函数的一级参数;调用方还可以通过 WithMarshalers/WithUnmarshalers 指定编组器和解组器,覆盖类型自身定义的方法,从而更好地传递配置,并为 proto.Message 等类型定制序列化方式。 💬 Key Quotes 在吸收更多反馈并进一步完善后,全新的 encoding/json/v2 和 encoding/json/jsontext 包已在 Go 1.27 中稳定发布并正式推出! 如果存在无效 UTF-8,v2 会报告错误。 如果 JSON 对象包含重复名称,v2 会报告错误。 v2 的解组性能显著快于 v1,基准测试显示性能最高提升 10x。 jsontext 包提供了在语法层面处理 JSON 的功能;其名称源自 RFC 8259 第 2 节,该节将 JSON 数据的语法直接称为 JSON-text。 📊 Article Meta AI Screening: 85 Source: Hacker News Author: Hacker News Category: 软件编程 Language: 英文 Read Time: 13 min Word Count: 3185 Tags: 编程与工程 , 编程语言 , 性能优化 , 开源项目 , Go Read Full Article