Tipi come sql.NullInt64
non implementano alcuna gestione speciale per il marshalling o unmarshaling JSON, pertanto si applicano le regole predefinite. Poiché il tipo è una struttura, viene eseguito il marshalling come oggetto con i relativi campi come attributi.
Un modo per aggirare questo è creare il proprio tipo che implementa le interfacce json.Marshaller
/json.Unmarshaler
. Incorporando il tipo sql.NullInt64
, otteniamo i metodi SQL gratuitamente. Qualcosa di simile a questo:
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
}
Se si utilizza questo tipo al posto di sql.NullInt64
, dovrebbe essere codificato come previsto.
È possibile verificare questo esempio qui: http://play.golang.org/p/zFESxLcd-c
fonte
2015-10-12 03:27:13
Si dovrebbe spiegare che cosa si intende per "non come ha usato per essere quando ho usato Int64 regolare e la stringa" nella sua interrogazione. – kostya
hai provato a usare i puntatori a ints, sì? cioè: var anint * int, quindi usando & anint se è nullo, il puntatore sarà nullo. funziona bene con la codifica JSON. questo funziona con gorp di sicuro, non sono stati testati con pacchetto SQL diretto sebbene –