如何将日期字符串绑定到结构?
How do I bind a date string to a struct?
type TestModel struct {
Date time.Time `json:"date" form:"date" gorm:"index"`
gorm.Model
}
我正在使用 echo 框架,并且
我有一个像上面的结构,我得到了像 '2021-09-27' 这样的字符串数据,我怎样才能将它绑定到结构?
func CreateDiary(c echo.Context) error {
var getData model.TestModel
if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
fmt.Print(err.Error())
}
return c.JSON(200, getData)
}
当我这样编码时,出现以下错误:
code=400, message=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T", internal=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T"
我是一个golang初学者,请问能不能举个简单的例子??
我正在使用 echo 框架
这里是回显中使用的可用标签列表。如果要从 body 解析,则使用 json
- query - 来源为请求查询参数。
- param - source 是路由路径参数。
- header - 源是 header 参数。
- 表格 - 来源是表格。值取自查询和请求 body。使用 Go 标准库形式解析。
- json - 来源是请求 body。使用 Go json 包进行解组。
- xml - 来源是请求 body。使用 Go xml 包进行解组。
您需要将 time.Time 包装到自定义结构中,然后实现 json.Marshaler
and json.Unmarshaler
接口
例子
package main
import (
"fmt"
"strings"
"time"
"github.com/labstack/echo/v4"
)
type CustomTime struct {
time.Time
}
type TestModel struct {
Date CustomTime `json:"date"`
}
func (t CustomTime) MarshalJSON() ([]byte, error) {
date := t.Time.Format("2006-01-02")
date = fmt.Sprintf(`"%s"`, date)
return []byte(date), nil
}
func (t *CustomTime) UnmarshalJSON(b []byte) (err error) {
s := strings.Trim(string(b), "\"")
date, err := time.Parse("2006-01-02", s)
if err != nil {
return err
}
t.Time = date
return
}
func main() {
e := echo.New()
e.POST("/test", CreateDiary)
e.Logger.Fatal(e.Start(":1323"))
}
func CreateDiary(c echo.Context) error {
var getData TestModel
if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
fmt.Print(err.Error())
}
return c.JSON(200, getData)
}
测试
curl -X POST http://localhost:1323/test -H 'Content-Type: application/json' -d '{"date":"2021-09-27"}'
键入 CustomTime time.Time
func (ct *CustomTime) UnmarshalParam(param string) error {
t, err := time.Parse(`2006-01-02`, param)
if err != nil {
return err
}
*ct = CustomTime(t)
return nil
}
type TestModel struct {
Date time.Time `json:"date" form:"date" gorm:"index"`
gorm.Model
}
我正在使用 echo 框架,并且 我有一个像上面的结构,我得到了像 '2021-09-27' 这样的字符串数据,我怎样才能将它绑定到结构?
func CreateDiary(c echo.Context) error {
var getData model.TestModel
if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
fmt.Print(err.Error())
}
return c.JSON(200, getData)
}
当我这样编码时,出现以下错误:
code=400, message=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T", internal=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T"
我是一个golang初学者,请问能不能举个简单的例子??
我正在使用 echo 框架
这里是回显中使用的可用标签列表。如果要从 body 解析,则使用 json
- query - 来源为请求查询参数。
- param - source 是路由路径参数。
- header - 源是 header 参数。
- 表格 - 来源是表格。值取自查询和请求 body。使用 Go 标准库形式解析。
- json - 来源是请求 body。使用 Go json 包进行解组。
- xml - 来源是请求 body。使用 Go xml 包进行解组。
您需要将 time.Time 包装到自定义结构中,然后实现 json.Marshaler
and json.Unmarshaler
接口
例子
package main
import (
"fmt"
"strings"
"time"
"github.com/labstack/echo/v4"
)
type CustomTime struct {
time.Time
}
type TestModel struct {
Date CustomTime `json:"date"`
}
func (t CustomTime) MarshalJSON() ([]byte, error) {
date := t.Time.Format("2006-01-02")
date = fmt.Sprintf(`"%s"`, date)
return []byte(date), nil
}
func (t *CustomTime) UnmarshalJSON(b []byte) (err error) {
s := strings.Trim(string(b), "\"")
date, err := time.Parse("2006-01-02", s)
if err != nil {
return err
}
t.Time = date
return
}
func main() {
e := echo.New()
e.POST("/test", CreateDiary)
e.Logger.Fatal(e.Start(":1323"))
}
func CreateDiary(c echo.Context) error {
var getData TestModel
if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
fmt.Print(err.Error())
}
return c.JSON(200, getData)
}
测试
curl -X POST http://localhost:1323/test -H 'Content-Type: application/json' -d '{"date":"2021-09-27"}'
键入 CustomTime time.Time
func (ct *CustomTime) UnmarshalParam(param string) error {
t, err := time.Parse(`2006-01-02`, param)
if err != nil {
return err
}
*ct = CustomTime(t)
return nil
}