지보의 대답에 의해 영감을 그 대답에 코멘트에서 해시으로
:
http://play.golang.org/p/pUCBUgrjZC
package main
import "fmt"
import "time"
import "encoding/json"
type jsonTime struct {
time.Time
f string
}
func (j jsonTime) format() string {
return j.Time.Format(j.f)
}
func (j jsonTime) MarshalText() ([]byte, error) {
return []byte(j.format()), nil
}
func (j jsonTime) MarshalJSON() ([]byte, error) {
return []byte(`"` + j.format() + `"`), nil
}
func main() {
jt := jsonTime{time.Now(), time.Kitchen}
if jt.Before(time.Now().AddDate(0, 0, 1)) { // 1
x := map[string]interface{}{
"foo": jt,
"bar": "baz",
}
data, err := json.Marshal(x)
if err != nil {
panic(err)
}
fmt.Printf("%s", data)
}
}
이 솔루션 embeds jsonTime 구조체에로 time.time. Embedding은 모든 time.Time의 메소드를 jsonTime 구조체로 승격시켜 명시 적 유형 변환없이 사용할 수 있도록합니다 (// 1 참조). 로 time.time 임베드
또한 인코딩/JSON 마샬링 코드는 역방향 호환성을 이유로 MarshalText 방법 (MarshalText was added in Go 1.2, MarshalJSON 그 선행)보다 더 높은 우선 순위 MarshalJSON 방법을 촉진하는 단점이있다. 따라서 MarshalText에서 제공하는 사용자 지정 형식 대신 기본 time.Time 형식이 사용됩니다.
이 문제를 극복하기 위해 jsonTime 구조체에 대해 MarshalJSON을 재정의했습니다.
시간 필드에서이 점을 "omitempty"라고 어떻게 생각하십니까? – nojo