sql.NullInt64
のようなタイプは、JSONマーシャリングまたはアンマーシャリングの特別な処理を実装しないため、デフォルトのルールが適用されます。型は構造体なので、フィールドを属性として持つオブジェクトとして整列化されます。
これを回避する1つの方法は、json.Marshaller
/json.Unmarshaler
インターフェイスを実装する独自のタイプを作成することです。 sql.NullInt64
型を埋め込むことによって、SQLメソッドが無料で取得されます。このような何か:あなたはsql.NullInt64
の代わりにこのタイプを使用する場合は、あなたが期待するよう
type JsonNullInt64 struct {
sql.NullInt64
}
func (v JsonNullInt64) MarshalJSON() ([]byte, error) {
if v.Valid {
return json.Marshal(v.Int64)
} else {
return json.Marshal(nil)
}
}
func (v *JsonNullInt64) UnmarshalJSON(data []byte) error {
// Unmarshalling into a pointer will let us detect null
var x *int64
if err := json.Unmarshal(data, &x); err != nil {
return err
}
if x != nil {
v.Valid = true
v.Int64 = *x
} else {
v.Valid = false
}
return nil
}
、それはエンコードする必要があります。
あなたはここで、この例をテストすることができます。http://play.golang.org/p/zFESxLcd-c
をあなたは、あなたの質問に「私は定期的にInt64型と文字列を使用したときにそれがために使用されていないか」によって何を意味するか説明する必要があります。 – kostya
あなたはintsへのポインタを使用しようとしましたか?つまり:var anint * intを返し、そのポインタがnullの場合は&anintを使用します。 JSONエンコーディングでうまく動作します。これは確かにgorpで動作しますが、まっすぐなSQLパッケージではテストしていません –