nakamura244 blog

所属団体とは関係なく、個人的なblog

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.IntUnmarshalして sql.NullInt64のフィールドに詰め込み直すようにした

Unmarshalってそんな高速に動くイメージがなくて(本来はちゃんとベンチ取るべき)、何度も使うと性能のボトルネックになり得るだろうなと思ってあまり使い回す事をやめようと思ってた

おまけ

null.Intって中身を見たら

null.Int{
    NullInt64:sql.NullInt64{
        Int64:0, 
        Valid:false
    }
}

sql.NullInt64がネストされているだけっぽかった。

最終的に詰め込みたい先の構造体フィールド(sql.NullInt64)に詰め込みやすいなnull.Intはという事でこれを使ってる