[Go类型,例如Int64
和String
无法存储空值,因此我发现可以为此使用sql.NullInt64和sql.NullString。
但是当我在Struct中使用它们时,并使用json包从Struct生成JSON,那么格式与我使用常规Int64
和String
类型时的格式不同。
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