最近我一直在玩,很棒。我无法想像(通过文档和博客文章查看后)是如何获取time.Time类型格式化为任何格式,我想要的,当它由json.NewEncoder.Encode编码
这是一个最小的代码示例:
package main type Document struct { Name string Content string Stamp time.Time Author string } func sendResponse(data interface{},w http.ResponseWriter,r * http.Request){ _,err := json.Marshal(data) j := json.NewEncoder(w) if err == nil { encodedErr := j.Encode(data) if encodedErr != nil{ //code snipped } }else{ //code snipped } } func main() { http.HandleFunc("/document",control.HandleDocuments) http.ListenAndServe("localhost:4000",nil) } func HandleDocuments(w http.ResponseWriter,r *http.Request) { w.Header().Set("Content-Type","application/json") w.Header().Set("Access-Control-Allow-Origin","*") switch r.Method { case "GET": //logic snipped testDoc := model.Document{"Meeting Notes","These are some notes",time.Now(),"Bacon"} sendResponse(testDoc,w,r) } case "POST": case "PUT": case "DELETE": default: //snipped } }
理想情况下,我想发送一个请求,并将Stamp字段恢复为2014年5月15日,而不是2014-05-16T08:28:06.801064-04:00
但是我不太确定如何,我知道我可以添加json:邮票到文档类型声明,以使用名称邮票而不是Stamp来编码字段,但是我不知道这些类型的东西被称为,所以我甚至不知道谷歌是如何找出是否有某种类型的格式化选项,以及。
有没有人链接到一个例子或良好的文档页面上关于这些类型标记(或任何他们称之为)的主题,或者如何告诉JSON编码器来处理time.Time字段?
只是为了参考,我看过这些页面:here和here,当然是at the official docs
你可以做的是将time.Time作为自己的自定义类型,并实现Marshaler接口:
type Marshaler interface { MarshalJSON() ([]byte,error) }
那么你会做的就是这样:
type JSONTime time.Time func (t JSONTime)MarshalJSON() ([]byte,error) { //do your serializing here stamp := fmt.Sprintf("\"%s\"",time.Time(t).Format("Mon Jan _2")) return []byte(stamp),nil }
并制作文件:
type Document struct { Name string Content string Stamp JSONTime Author string }
并让你的初始化看起来像:
testDoc := model.Document{"Meeting Notes",JSONTime(time.Now()),"Bacon"}
就是这样。如果你想要解组,那么还有Unmarshaler界面。