Json 请求正文日期解析问题
我有一个奇怪的问题。我正在使用Json 请求正文日期解析问题,json,date,go,go-echo,Json,Date,Go,Go Echo,我有一个奇怪的问题。我正在使用echo包进行路由。当我将json解码为struct时,我得到了错误解析时间\“2019-01-02 \”为\“2006-01-02T15:04:05Z07:00 \”:无法将\“T”解析为\“T” 我的结构 VendorAgreement struct { ID primitive.ObjectID `json:"id" bson:"_id"` StartDate time.Time
echo
包进行路由。当我将json
解码为struct
时,我得到了错误解析时间\“2019-01-02 \”为\“2006-01-02T15:04:05Z07:00 \”:无法将\“T”解析为\“T”
我的结构
VendorAgreement struct {
ID primitive.ObjectID `json:"id" bson:"_id"`
StartDate time.Time `json:"start_date,date" bson:"start_date"`
EndDate time.Time `json:"end_date,date" bson:"end_date"`
CommissionPercentage float32 `json:"commission_percentage" bson:"commission_percentage"`
Status int `json:"status" bson:"status"`
CreatedDate time.Time `json:"created_date" bson:"created_date"`
Media VendorAgreementMedia `json:"media" bson:"media"`
}
VendorAgreementMedia struct {
MediaId primitive.ObjectID `json:"mediaId" bson:"_id"`
FileName string `json:"file_name" bson:"file_name"`
SourcePath string `json:"source_path" bson:"source_path"`
CreatedDate time.Time `json:"created_date" bson:"created_date"`
}
我的解码步骤
var agreement VendorAgreement
err = json.NewDecoder(c.Request().Body).Decode(&agreement)
请求正文
{
"start_date":"2019-01-02",
"end_date":"2020-05-06",
"commission_percentage":10,
"media":{
"mediaId":"5cd1644cc57849f0761632b5"
}
}
要解组自定义时间格式,您需要具有自定义时间类型:
type Datetime struct {
time.Time
}
func (t *Datetime) UnmarshalJSON(input []byte) error {
strInput := strings.Trim(string(input), `"`)
newTime, err := time.Parse("2006-01-02", strInput)
if err != nil {
return err
}
t.Time = newTime
return nil
}
VendorAgreement struct {
ID primitive.ObjectID `json:"id" bson:"_id"`
StartDate Datetime `json:"start_date,date" bson:"start_date"`
EndDate Datetime `json:"end_date,date" bson:"end_date"`
CommissionPercentage float32 `json:"commission_percentage" bson:"commission_percentage"`
Status int `json:"status" bson:"status"`
CreatedDate Datetime `json:"created_date" bson:"created_date"`
Media VendorAgreementMedia `json:"media" bson:"media"`
}
VendorAgreementMedia struct {
MediaId primitive.ObjectID `json:"mediaId" bson:"_id"`
FileName string `json:"file_name" bson:"file_name"`
SourcePath string `json:"source_path" bson:"source_path"`
CreatedDate Datetime `json:"created_date" bson:"created_date"`
}
您可以这样解析mongo返回的日期:
layout := "2006-01-02T15:04:05.999999999Z07:00"
str := "2019-01-02T00:00:00.000Z"
t, err := time.Parse(layout, str)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(t)
}
您需要一个自定义的json.Unmarshaler来提取正确的时间。默认解组器无法知道您的时间格式。我假设您是
YYYY-MM-DD
,但它可能是yyy-DD-MM
。json.Unmarshal需要时间格式time.RFC3339
请参阅此内容,了解如何创建CustomTime类型来处理自定义格式。我会尝试让您知道这是可行的,但在我的mongo中,它保存为“开始日期”:{“时间”:ISODate(“2019-01-02T00:00:00.000Z”),“结束日期”:{“时间”:ISODate(“2020-05-06T00:00:00.000Z”)},