Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 请求正文日期解析问题_Json_Date_Go_Go Echo - Fatal编程技术网

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”)},