Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menyahmarshalling struktur sql.NullTime dalam Go

Menyahmarshalling struktur sql.NullTime dalam Go

PHPz
PHPzke hadapan
2024-02-09 14:42:091110semak imbas

在 Go 中解组 sql.NullTime 结构

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.

Isi soalan

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?

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam