2025/06/23 07:45 JSON evolution in Go: from v1 to v2

ロボ子、Go 1.25で導入される`encoding/json/v2`パッケージについて、何か知ってるか?

はい、博士。新しいJSONパッケージですね。`Marshal`と`Unmarshal`はv1と同様に使えるみたいです。

そうじゃな。それに、`MarshalWrite`と`UnmarshalRead`が導入されたのが大きいぞ。`Encoder`と`io.Writer`の代わりに`MarshalWrite`を使うらしい。

`MarshalWrite`は改行を追加しないんですね。`UnmarshalRead`は`io.EOF`まで読み込むと。

`MarshalEncode`と`UnmarshalDecode`も重要じゃ。`Encoder`と`Decoder`は`jsontext`パッケージに移動したみたいじゃな。

`UnmarshalDecode`はストリーミング方式で動作するんですね。効率が良さそうです。

オプションも豊富になったぞ。`FormatNilMapAsNull`や`FormatNilSliceAsNull`でnilマップとスライスをどうエンコードするか定義できる。

`MatchCaseInsensitiveNames`で大文字小文字を区別しない名前のマッチングもできるんですね。便利そうです。

タグも色々あるぞ。`omitzero`や`omitempty`で空の値を省略できるし、`string`で数値型を文字列として表現できる。

`case:ignore`や`case:strict`で大文字小文字の区別を制御できるんですね。柔軟性が高いです。

`format:template`でフィールド値をフォーマットしたり、`inline`でネストされたオブジェクトのフィールドを親に昇格させたりもできるぞ。

`unknown`タグで不明なフィールドの「キャッチオール」を提供できるのは面白いですね。

カスタムマーシャリングも進化しておる。`MarshalerTo`と`UnmarshalerFrom`インターフェースが推奨されとるぞ。

`MarshalFunc`と`UnmarshalFunc`でカスタムマーシャラー/アンマーシャラーを使えるのは便利ですね。

デフォルトの挙動も変わったんじゃ。nilスライスは`null`ではなく`[]`にmarshalされるようになった。

バイト配列は数値の配列ではなく、base64エンコードされた文字列になるんですね。

パフォーマンスも向上しておる。アンマーシャリングはv1より2.7倍から10.2倍高速らしいぞ。

それはすごいですね!`MarshalJSON`と`UnmarshalJSON`から`MarshalJSONTo`と`UnmarshalJSONFrom`への切り替えが効いているんですね。

ただし、`json/v2`パッケージは実験的なので、ビルド時に`GOEXPERIMENT=jsonv2`を設定する必要があるぞ。

なるほど。試してみるのが楽しみです。

そうじゃな。しかし、これだけ機能が増えると、JSONもはやJSONにあらず、じゃな。

博士、それはどういう意味ですか?

JSONだけに、冗長(JSON-cho)だってことじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
