json.Marshalがエラーを返すとき
go 1.14.3 で確認した内容で個人的なメモです.
使っているバージョンによって異なる可能性があるので一次情報を参照してください.
ソースコード上では encodeState の error が呼び出されているところを確認すれば良いと思われます.
エラーを返すパターン
主観ですが遭遇しそうな順で書きます.
- floatがInf, NaNだったときの
json.UnsupportedValueError
- ポインタの循環参照のときに発生する
json.UnsupportedValueError
json.Marshaler
,encoding.TextMarshaler
のMarshal失敗したときのjson.MarshalerError
- mapのkeyがint, uint, string, ptrではなく,
encoding.TextMarshaler
が実装されていないときのjson.UnsupportedTypeError
- mapのkeyが
encoding.TextMarshaler
を実装していて, marshalに失敗したときのfmt.Errorf("json: encoding error for type: %q")
json.Number
で不正な数字列だったときのfmt.Errorf("json: invalid number literal: %q")
ハマりそうなポイント
mapのkeyの encoding.TextMarshaler
が失敗したときのエラーは json.MarshalerError
ではない.
json.Number
をMarshalしたときに文字列が数値として正しくない場合に json パッケージのエラーは返ってこない.