インテリジェンスレポート

Go 1.27、encoding/json/v2とjsontextを実験版から安定版へ

1年前に実験版として公開された新JSONパッケージは、encoding/jsonが抱える正確性・セキュリティ・性能面の積年の欠陥の解消を狙う。

INSIGHTEX Editorial Desk

2 分で読めます

Go 1.27、encoding/json/v2とjsontextを実験版から安定版へインテリジェンスレポート

何が起きたのか

Go 1.27のリリースにより、encoding/json/v2パッケージと、その補完となるencoding/json/jsontextが安定版となり、一般利用が可能になったと、Goが報告した。2026年11月4日付の投稿には7人の著者が名を連ね、Joe Tsai、Damien Neil、Daniel Martí、Michael Prattらが含まれる。これは前年に導入された実験版APIに続くもので、その後寄せられたフィードバックをもとに改良された。

著者らによると、従来のencoding/jsonパッケージは柔軟性が高いと実証されてきた一方、長年にわたりユーザーから指摘されてきた欠陥を抱えている。RFC 8259が禁じている不正なUTF-8を許容してしまう。また、メンバー名が重複したオブジェクトも受け入れるが、これは過去に攻撃者に悪用された弱点で、例としてCVE-2017-12635がある。さらに、フィールド名を大文字小文字を区別せずに照合し、nilのスライスやマップをnullとしてエンコードする。

投稿によれば、これらの挙動は、Go 1の互換性保証を破らずに修正することはできなかった。値全体をメモリにバッファリングしてしまうことや、カスタムメソッドがMarshalやUnmarshalを再帰的に呼び出す際に二次的な速度低下が生じることといった性能上の制約も同様だ。新しい設計は作業を二つに分ける。jsontextはリフレクションに頼らずJSONの構文を扱い、json/v2はJSONの値をGoの型に対応付ける。

背景

GoはGo 1.0より前から標準ライブラリでJSONをサポートしており、著者らはJSONをインターネット上で最も広く使われているデータ形式だと説明している。問題が既存のAPIそのものに起因するため、元のパッケージ内にMarshalV2のような並行する関数を追加するのではなく、別のv2名前空間を設けることにした。投稿で引用された調査では、ほとんどのGoユーザーがnilのスライスやマップを空の配列やオブジェクトとしてエンコードすることを望んでいることが分かった。

出典Go

ブリーフィング

1週間のテックニュースを1通のメールで。

読む価値のある記事を毎週お届けします。配信停止はいつでも可能です。