Int64
和 String
等 Go 类型不能存储空值,
所以我发现我可以使用 sql.NullInt64和 sql.NullString为此。
但是当我在 Struct 中使用这些时,
并使用 json 从 Struct 生成 JSON包裹,
那么格式与我使用常规 Int64
和 String
类型时的格式不同。
JSON 有一个额外的级别,因为 sql.Null*** 也是一个 Struct。
有没有好的解决方法, 还是我不应该在我的 SQL 数据库中使用 NULL?
最佳答案
sql.NullInt64
之类的类型不对 JSON 编码或解码进行任何特殊处理,因此适用默认规则。由于该类型是一个结构,它被编码为一个对象,其字段作为属性。
解决此问题的一种方法是创建您自己的实现 json.Marshaller
/json.Unmarshaler
接口(interface)的类型。通过嵌入 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
https://stackoverflow.com/questions/33072172/