薄いブログ

技術の雑多なことを書く場所

json.Marshalがエラーを返すとき

go 1.14.3 で確認した内容で個人的なメモです.

使っているバージョンによって異なる可能性があるので一次情報を参照してください.

golang.org

github.com

ソースコード上では encodeState の error が呼び出されているところを確認すれば良いと思われます.

エラーを返すパターン

主観ですが遭遇しそうな順で書きます.

  1. floatがInf, NaNだったときの json.UnsupportedValueError
  2. ポインタの循環参照のときに発生する json.UnsupportedValueError
  3. json.Marshaler, encoding.TextMarshaler のMarshal失敗したときの json.MarshalerError
  4. mapのkeyがint, uint, string, ptrではなく, encoding.TextMarshaler が実装されていないときの json.UnsupportedTypeError
  5. mapのkeyが encoding.TextMarshaler を実装していて, marshalに失敗したときの fmt.Errorf("json: encoding error for type: %q")
  6. json.Number で不正な数字列だったときの fmt.Errorf("json: invalid number literal: %q")

ハマりそうなポイント

mapのkeyの encoding.TextMarshaler が失敗したときのエラーは json.MarshalerError ではない.

json.Number をMarshalしたときに文字列が数値として正しくない場合に json パッケージのエラーは返ってこない.