Go 类型如Int64
and String
不能存储空值,
所以我发现我可以使用sql.NullInt64 https://golang.org/pkg/database/sql/#NullInt64 and sql.NullString https://golang.org/pkg/database/sql/#NullString为了这。
但是当我在结构中使用这些时,
并使用以下结构从 Struct 生成 JSONjson https://golang.org/pkg/encoding/json/包裹,
那么格式与我使用常规时不同Int64
and String
types.
JSON 有一个额外的级别,因为 sql.Null*** 也是一个结构。
有没有好的解决办法,
或者我不应该在 SQL 数据库中使用 NULL?
类型如sql.NullInt64
不对 JSON 编组或解组实现任何特殊处理,因此应用默认规则。由于该类型是一个结构体,因此它被编组为一个对象,其字段作为属性。
解决这个问题的一种方法是创建您自己的类型来实现json.Marshaller
/ json.Unmarshaler
接口。通过嵌入sql.NullInt64
类型,我们免费获得 SQL 方法。像这样的事情:
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
}
如果您使用此类型代替sql.NullInt64
,它应该按照您的预期进行编码。
您可以在这里测试这个示例:http://play.golang.org/p/zFESxLcd-c http://play.golang.org/p/zFESxLcd-c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)