I've been playing with Go recently and it's awesome. The thing I can't seem to figure out (after looking through documentation and blog posts) is how to get the time.Time
type to format into whatever format I'd like when it's encoded by json.NewEncoder.Encode
Here's a minimal Code example:
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
}
}
Ideally, I'd like to send a request and get the Stamp field back as something like May 15, 2014
and not 2014-05-16T08:28:06.801064-04:00
But I'm not really sure how, I know I can add json:stamp
to the Document type declaration to get the field to be encoded with the name stamp instead of Stamp, but I don't know what those types of things are called, so I'm not even sure what to google for to find out if there is some type of formatting option in that as well.
Does anyone have a link to the an example or good documentation page on the subject of those type mark ups (or whatever they're called) or on how I can tell the JSON encoder to handle time.Time
fields?
Just for reference, I have looked at these pages: here and here and of course, at the official docs
Perhaps another way will be interesting for someone. I wanted to avoid using alias type for Time.
Source: http://choly.ca/post/go-json-marshalling/
You mean tags. But these won't help you with your formatting problem.
The string representation you get for your time is returned by
MarshalJSON
implemented byTime
.You can go ahead and implement your own
MarshalJSON
method by copying the relevant bits from theTime
implementation by either embeddingtime.Time
or wrapping it. Wrapping example (Click to play):What you can do is, wrap time.Time as your own custom type, and make it implement the
Marshaler
interface:So what you'd do is something like:
and make document:
and have your intialization look like:
And that's about it. If you want unmarshaling, there is the
Unmarshaler
interface too.I would NOT use:
I would use it only for primitives (string, int, ...). In case of
time.Time
which is a struct, I would need to cast it every time I want to use anytime.Time
method.I would do this instead (embedding):
No need to cast
t
to time. The only difference is that new instance is NOT created byJSONTime(time.Now())
but byJSONTime{time.Now()}