php小编小新在Go语言中,我们经常会使用sql.NullTime结构来处理数据库中的时间字段。NullTime结构可以表示一个可空的时间值,非常适用于处理数据库中的空值。在本文中,我们将介绍如何解组sql.NullTime结构,以及如何正确处理其中可能存在的空值情况。无论您是初学者还是有一定经验的开发者,本文都将为您提供清晰的指导,帮助您更好地理解和使用NullTime结构。
给定
type NullTime struct { Time time.Time Valid bool // Valid is true if Time is not NULL }
和
type PayinCount struct { DateShiftStart sql.NullTime `json:"dateShiftStart"` DateShiftEnd sql.NullTime `json:"dateShiftend"` }
当我处理以下 JSON 时
{ "dateShiftStart":"2023-10-16", "dateShiftEnd":"2023-10-23" }
与
var payinsCount PayinsCount err = json.Unmarshal(body, &payinsCount) if err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return }
其中 sendErrorResponse 是以下辅助进程
func sendErrorResponse(w http.ResponseWriter, err string, statusCode int) { messageStatusCode := MessageStatusCode{ Message: err, StatusCode: statusCode} w.WriteHeader(statusCode) json.NewEncoder(w).Encode(messageStatusCode) }
我收到以下消息
{ "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime", "statusCode": 400 }
如何解决这个问题?
我最终使用了以下内容。 我添加了以下类型。
type NullDate sql.NullTime
然后我将 PayinsCount 更改为使用 NullDate
type PayinsCount struct { DateShiftStart NullDate `json:"dateShiftStart,omitempty"` DateShiftEnd NullDate `json:"dateShiftend,omitempty"` }
然后我创建了
// UnmarshalJSON for NullDate func (nd *NullDate) UnmarshalJSON(b []byte) error { s := string(b) s = strings.ReplaceAll(s, "\"", "") x, err := time.Parse(time.DateOnly, s) if err != nil { nd.Valid = false return err } nd.Time = x nd.Valid = true return nil }
现在当我处理以下 JSON 时
{ "dateShiftStart":"2023-10-16", "dateShiftEnd":"2023-10-23" }
与
var payinsCount PayinsCount err = json.Unmarshal(body, &payinsCount) if err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return }
它有效。我最终得到了一个有效的 PayinsCount 实例。
为了完整起见,这里是 NullDate 的 MarshalJSON 函数
// MarshalJSON for NullDate func (nd NullDate) MarshalJSON() ([]byte, error) { if !nd.Valid { return []byte("null"), nil } val := fmt.Sprintf("\"%s\"", nd.Time.Format(time.DateOnly)) return []byte(val), nil }
注意转义的双引号 - 如果没有它们,encoding/json 编组代码将以 3 个块的形式处理日期字符串,并且我收到以下错误
error(*encoding/json.SyntaxError) *{msg: "invalid character '-' after top-level value", Offset: 0}
以上是在 Go 中解组 sql.NullTime 结构的详细内容。更多信息请关注PHP中文网其他相关文章!