Menyahmarshalling struktur sql.NullTime dalam Go

PHPz
Lepaskan: 2024-02-09 14:42:09
ke hadapan
1138 orang telah melayarinya

在 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
}
Salin selepas log masuk

dan

type PayinCount struct {
    DateShiftStart sql.NullTime    `json:"dateShiftStart"`
    DateShiftEnd   sql.NullTime    `json:"dateShiftend"`
}
Salin selepas log masuk

Apabila saya memproses JSON berikut

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
Salin selepas log masuk
Salin selepas log masuk

dan

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
Salin selepas log masuk
Salin selepas log masuk

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)
}
Salin selepas log masuk

Saya menerima mesej berikut

{
    "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime",
    "statusCode": 400
}
Salin selepas log masuk

Bagaimana untuk menyelesaikan masalah ini?

Penyelesaian

Saya akhirnya menggunakan yang berikut. Saya menambah jenis berikut.

type NullDate sql.NullTime
Salin selepas log masuk

Kemudian saya menukar PayinsCount untuk menggunakan NullDate

type PayinsCount struct {
    DateShiftStart NullDate      `json:"dateShiftStart,omitempty"`
    DateShiftEnd   NullDate      `json:"dateShiftend,omitempty"`
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Sekarang apabila saya memproses JSON berikut

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
Salin selepas log masuk
Salin selepas log masuk

dan

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
Salin selepas log masuk
Salin selepas log masuk

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
}
Salin selepas log masuk

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}
Salin selepas log masuk

Atas ialah kandungan terperinci Menyahmarshalling struktur sql.NullTime dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!