editor php Xiaoxin Dalam bahasa Go, kami sering menggunakan struktur sql.NullTime untuk memproses medan masa dalam pangkalan data. Struktur NullTime boleh mewakili nilai masa yang boleh dibatalkan dan sangat sesuai untuk mengendalikan nilai nol dalam pangkalan data. Dalam artikel ini, kami akan menerangkan cara menyahmarshal struktur sql.NullTime dan cara mengendalikan situasi nol yang mungkin wujud di dalamnya dengan betul. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda panduan yang jelas untuk membantu anda memahami dan menggunakan struktur NullTime dengan lebih baik.
diberikan
type NullTime struct { Time time.Time Valid bool // Valid is true if Time is not NULL }
dan
type PayinCount struct { DateShiftStart sql.NullTime `json:"dateShiftStart"` DateShiftEnd sql.NullTime `json:"dateShiftend"` }
Apabila saya memproses JSON berikut
{ "dateShiftStart":"2023-10-16", "dateShiftEnd":"2023-10-23" }
dan
var payinsCount PayinsCount err = json.Unmarshal(body, &payinsCount) if err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return }
di mana sendErrorResponse ialah proses tambahan berikut
func sendErrorResponse(w http.ResponseWriter, err string, statusCode int) { messageStatusCode := MessageStatusCode{ Message: err, StatusCode: statusCode} w.WriteHeader(statusCode) json.NewEncoder(w).Encode(messageStatusCode) }
Saya menerima mesej berikut
{ "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime", "statusCode": 400 }
Bagaimana untuk menyelesaikan masalah ini?
Saya akhirnya menggunakan yang berikut. Saya menambah jenis berikut.
type NullDate sql.NullTime
Kemudian saya menukar PayinsCount untuk menggunakan NullDate
type PayinsCount struct { DateShiftStart NullDate `json:"dateShiftStart,omitempty"` DateShiftEnd NullDate `json:"dateShiftend,omitempty"` }
Kemudian saya mencipta
// 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 }
Sekarang apabila saya memproses JSON berikut
{ "dateShiftStart":"2023-10-16", "dateShiftEnd":"2023-10-23" }
dan
var payinsCount PayinsCount err = json.Unmarshal(body, &payinsCount) if err != nil { sendErrorResponse(w, err.Error(), http.StatusBadRequest) return }
Ia berkesan. Saya mendapat contoh PayinsCount yang sah.
Untuk kesempurnaan, berikut ialah fungsi MarshalJSON untuk NullDate
// 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 }
Perhatikan petikan berganda yang terlepas - tanpanya kod pengekodan/json marshaling memproses rentetan tarikh dalam 3 ketul dan saya mendapat ralat berikut
error(*encoding/json.SyntaxError) *{msg: "invalid character '-' after top-level value", Offset: 0}
Atas ialah kandungan terperinci Menyahmarshalling struktur sql.NullTime dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!