Запросить разбор даты тела - PullRequest
1 голос
/ 07 мая 2019

У меня странная проблема. Я использую echo пакет для маршрутизации. Пока я декодирую json в struct я получаю ошибку parsing time \"\"2019-01-02\"\" as \"\"2006-01-02T15:04:05Z07:00\"\": cannot parse \"\"\" as \"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"
    }
}

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вам нужно иметь пользовательский тип времени, чтобы разобрать пользовательский формат времени:

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"`
}
0 голосов
/ 08 мая 2019

Вы можете разобрать дату, возвращенную Монго, следующим образом:

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)
}
...