我一直在處理來自 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個贊
如果有很多結構,而您只是實現(xiàn)自定義編組和解組功能,那么要做的工作很多。您可以使用另一個庫來代替,例如 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 關注
- 222 瀏覽
添加回答
舉報
0/150
提交
取消