zeeboの答えに触発されて、その答えをコメントでアウトハッシュ化されたよう
:
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。埋め込みはすべてのtime.TimeのメソッドをjsonTime構造体に昇格させ、明示的な型変換なしでその使用を可能にします(// 1を参照)。
埋め込むtime.Timeには、MarshalJSONメソッドも宣伝されているという欠点があります。これは、encoding/jsonマーシャリングコードが後方互換性の理由でMarshalTextメソッドよりも優先順位が高くなります(MarshalText was added in Go 1.2、MarshalJSONより前です)。その結果、MarshalTextによって提供されるカスタム形式の代わりに、デフォルトのtime.Time形式が使用されます。
この問題を解決するために、jsonTime構造体のMarshalJSONをオーバーライドします。
あなたはこの敬意を時間フィールドで "omitempty"とどのようにしますか? – nojo