使用 Go 类型转换对 SQL NULL 值进行 JSON 处理
虽然 Int64 和 String 等 Go 类型无法存储 null 值,但可以使用 sql.NullInt64 sql.NullString 允许此功能。然而,与常规 Int64 和 String 类型相比,使用 json 包将这些类型编码为 JSON 会导致格式发生变化。
出现这种差异是因为 sql.Null* 类型本身就是结构体,导致JSON 表示中的附加嵌套级别。为了克服这一问题,可以实现遵循 json.Marshaller 和 json.Unmarshaler 接口的自定义类型。
例如,可以定义 JsonNullInt64 类型,嵌入 sql.NullInt64 类型并实现自定义 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 { // Pointer unmarshalling ensures NULL detection 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 替换JsonNullInt64 产生所需的 JSON 编码。如需进一步测试,请参阅此游乐场:http://play.golang.org/p/zFESxLcd-c
以上是如何使用 Go 类型转换处理 JSON 中的 SQL NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!