我一直在处理来自 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 logger
import (
"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 struct
type 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
}
凤凰求蛊
眼眸繁星
相关分类