在 Go 中使用 SQL NULL 值和 JSON
在 Go 中使用可空值时,通常使用 sql.NullInt64 等类型和 sql.NullString。但是,当从包含它们的结构生成 JSON 时,这些类型可能会导致意外结果。具体来说,JSON 输出可能包含额外的级别,因为 sql.Null*** 也是一个结构体。
解决方法
要解决此问题,一种解决方法是创建一个实现 json.Marshaller 和 json.Unmarshaler 接口的自定义类型。通过嵌入 sql.NullInt64 类型,您可以无缝处理 SQL 方法,同时定义自己的 JSON 编组和解组行为。
这是一个示例:
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,JSON 输出将采用您期望的格式,无需额外的
示例
您可以通过以下链接测试此示例:
http://play.golang.org/p/zFESxLcd -c
以上是如何在 Go 中有效处理 SQL NULL 值和 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!