自定义 time.Time 类型返回数据存储

我一直在处理来自 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

}


慕森卡
浏览 195回答 2
2回答

凤凰求蛊

如果有很多结构,而您只是实现自定义编组和解组功能,那么要做的工作很多。您可以使用另一个库来代替,例如 json-iterator 扩展jsontime:import "github.com/liamylian/jsontime"var json = jsontime.ConfigWithCustomTimeFormattype 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"`}

眼眸繁星

time.Time 已经有一个UnmarshalJSON 方法。它将从 RFC3339 格式的 JSON 字符串解组为 time.Time。如果之后您需要其他字符串格式,则可以使用(t *time.Time).Format(layout string)使用任何所需的格式。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go