golangのjson.Marshal/Unmarshalでちょっとハマった話
はじめに
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
はという事でこれを使ってる