我一直在处理来自 JSON POST 到我们的 Go API 的自定义时间格式的各种示例。我有一个 UnmarshalJSON 的覆盖函数,看起来一切正常。但是,当我将结构保存到数据存储中时,它不会被识别为 time.Time 值,因此不会被设置/保存。'toString' 函数打印出我希望在数据存储中看到的正确时间,但无法弄清楚如何转换它或将其转换为 time.Time 数据存储保存。这是我们正在构建的一个简单的日志记录 API 功能。请参阅下面的代码。我想就像将任意字符串转换为 time.Time 的 UnmarshalJSON 一样,然后转换为“Timestamp”(在这种情况下)是否有一个 Datastore 等价物在保存之前将其放回 time.Time?感谢您的任何帮助/指导。我确实有这样一个 'DateString' 是一个字符串值,当解组 'AppLog' 时通过 JSON 设置,然后我将它转换为 'Date' time.Time,但想要更“slick”并使用如果可能,UnmarshalJSON。package loggerimport ( "encoding/json" "errors" "fmt" "io" "io/ioutil" "log" "net/http" "time" "golang.org/x/net/context" "google.golang.org/appengine" "google.golang.org/appengine/datastore" "github.com/gorilla/mux")func init() { router := mux.NewRouter() router.HandleFunc("/applogger", DoLog).Methods("POST") http.Handle("/applogger/", router)}// DoLog --func DoLog(rw http.ResponseWriter, request *http.Request) { var applog AppLog body, err := ioutil.ReadAll(io.LimitReader(request.Body, 1048576)) if err != nil { panic(err) } if err := request.Body.Close(); err != nil { panic(err) } if err := json.Unmarshal(body, &applog); err != nil { panic(err) } applog.IP = request.RemoteAddr log.Print("my timestamp", applog.Date) ctx := appengine.NewContext(request) applog.Save(ctx) fmt.Fprint(rw, "applogger - success")}// AppLog structtype AppLog struct { Application string `json:"application" datastore:"application"` Platform string `json:"platform" datastore:"platform,noindex"` Date Timestamp `json:"date" datastore:"date"` Data string `json:"data" datastore:"data,noindex"` IP string `json:"-" datastore:"ip,noindex"`}// Save --func (al *AppLog) Save(ctx context.Context) *datastore.Key { key := datastore.NewKey(ctx, "AppLog", "", 0, nil) if _, err := datastore.Put(ctx, key, al); err != nil { return nil } return key}
2 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
如果有很多结构,而您只是实现自定义编组和解组功能,那么要做的工作很多。您可以使用另一个库来代替,例如 json-iterator 扩展jsontime:
import "github.com/liamylian/jsontime"
var json = jsontime.ConfigWithCustomTimeFormat
type Book struct {
Id int `json:"id"`
UpdatedAt *time.Time `json:"updated_at" time_format:"sql_date" time_utc:"true"`
CreatedAt time.Time `json:"created_at" time_format:"sql_datetime" time_location:"UTC"`
}
眼眸繁星
TA贡献1873条经验 获得超9个赞
time.Time 已经有一个UnmarshalJSON 方法。它将从 RFC3339 格式的 JSON 字符串解组为 time.Time。
如果之后您需要其他字符串格式,则可以使用
(t *time.Time).Format(layout string)
使用任何所需的格式。
- 2 回答
- 0 关注
- 194 浏览
添加回答
举报
0/150
提交
取消