はじめに
Goのjson.Marshal/Unmarshalを使っててちょっと気になったところを残しておこうと思ったので書こうと思う
json - The Go Programming Language
出くわしたエラー
Unmarshalの方を使ってて下記のエラーに出くわした
json: cannot unmarshal number NullInt64
まぁ対応している型ではないのでエラーなんですけど...
なんでNullInt64にマッピングしたかったのかというと
- 対象のjsonデータを
Unmarshalして他のtableにinsertしたかった。 - そのinsert先のtableの該当のカラムの型が、sql.NullInt64の構造体フィールドだった為、
NullInt64にマッピングしたら楽じゃんと思った。
どう対処したか
json.RawMessageを使ってとかjson.Numberを使ってとか、mapでいったん受け取ってループでごにょごにょとか色々考えたんですが、
最終的にシンプルにjson.Marshal/Unmarshalになるべく任せて処理したかったのでnull.IntでUnmarshalして
sql.NullInt64のフィールドに詰め込み直すようにした
Unmarshalってそんな高速に動くイメージがなくて(本来はちゃんとベンチ取るべき)、何度も使うと性能のボトルネックになり得るだろうなと思ってあまり使い回す事をやめようと思ってた
おまけ
null.Intって中身を見たら
null.Int{
NullInt64:sql.NullInt64{
Int64:0,
Valid:false
}
}
sql.NullInt64がネストされているだけっぽかった。
最終的に詰め込みたい先の構造体フィールド(sql.NullInt64)に詰め込みやすいなnull.Intはという事でこれを使ってる