MST

星途 面试题库

面试题:Go JSON定制序列化与反序列化

在Go语言中,有一个结构体 `type CustomTime struct { time.Time }`,你需要定制这个结构体的JSON序列化和反序列化行为。序列化时,将时间格式化为 `YYYY - MM - DD HH:MM:SS`,反序列化时,能够接受 `YYYY - MM - DD` 或者 `YYYY - MM - DD HH:MM:SS` 格式的时间字符串,并正确解析。请实现这个 `CustomTime` 结构体的 `MarshalJSON` 和 `UnmarshalJSON` 方法。
20.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type CustomTime struct {
    time.Time
}

const (
    layout1 = "2006-01-02"
    layout2 = "2006-01-02 15:04:05"
)

func (ct *CustomTime) MarshalJSON() ([]byte, error) {
    if ct.Time.IsZero() {
        return json.Marshal(nil)
    }
    formattedTime := ct.Time.Format(layout2)
    return json.Marshal(formattedTime)
}

func (ct *CustomTime) UnmarshalJSON(data []byte) error {
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }
    if len(s) == len(layout1) {
        t, err := time.Parse(layout1, s)
        if err != nil {
            return err
        }
        ct.Time = t
    } else if len(s) == len(layout2) {
        t, err := time.Parse(layout2, s)
        if err != nil {
            return err
        }
        ct.Time = t
    } else {
        return fmt.Errorf("invalid time format")
    }
    return nil
}