Golang API中JSON时间格式解析失败问题求助
解决Golang JSON解析自定义时间格式的问题
问题原因
Go标准库的encoding/json包默认只支持RFC3339格式的时间字符串(例如2000-12-31T14:30:15Z)解析为time.Time类型,而你请求体中的birthday用的是空格分隔的格式(2000-12-31 14:30:15),不符合默认解析规则,因此报错。
两种解决方案
方案一:修改请求体为标准格式(快速测试用)
直接在Postman的请求体中,把birthday字段的值改成RFC3339格式即可,比如:
{ "firstName": "MakeUPDATED", "lastName": "FakeUPDATED", "birthday": "2000-12-31T14:30:15Z", "phoneNumber": "98423423" }
如果需要指定时区,也可以写成"2000-12-31T14:30:15+08:00"(东八区),这样默认的json.Decoder就能正常解析。
方案二:自定义时间类型的反序列化(兼容现有请求格式)
如果不想修改请求格式,可以通过自定义类型并实现UnmarshalJSON方法来支持空格分隔的时间格式:
- 定义自定义时间类型并实现反序列化方法
import ( "strings" "time" ) // 自定义时间类型,包装time.Time type CustomTime time.Time // 指定需要兼容的时间格式 const customTimeLayout = "2006-01-02 15:04:05" // 实现UnmarshalJSON方法,处理自定义格式的时间字符串 func (ct *CustomTime) UnmarshalJSON(b []byte) error { // 去除JSON字符串的前后引号 rawStr := strings.Trim(string(b), "\"") if rawStr == "null" { *ct = CustomTime(time.Time{}) return nil } // 按照自定义格式解析时间 parsedTime, err := time.Parse(customTimeLayout, rawStr) if err != nil { return err } *ct = CustomTime(parsedTime) return nil } // 可选:实现MarshalJSON方法,保证序列化时输出同样格式的时间 func (ct CustomTime) MarshalJSON() ([]byte, error) { return []byte("\"" + time.Time(ct).Format(customTimeLayout) + "\""), nil }
- 修改请求结构体的字段类型
把UpdateAccountRequest中的Birthday字段类型从time.Time换成自定义的CustomTime:
type UpdateAccountRequest struct { FirstName string `json:"firstName"` LastName string `json:"lastName"` Birthday CustomTime `json:"birthday"` // 使用自定义时间类型 PhoneNumber string `json:"phoneNumber"` }
- 使用时转换为time.Time
如果业务逻辑中需要使用标准的time.Time类型,直接强制转换即可:
standardTime := time.Time(updateAccReq.Birthday)
这样修改后,Postman发送原来格式的请求体就能正常解析了。
内容的提问来源于stack exchange,提问作者srmback
相关产品推荐
相关产品推荐

