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中文網其他相關文章!