试图让json Marshal包含2个时间字段的结构.但是如果它有时间价值,我只希望该字段能够通过.所以我正在使用json:“,omitempty”但它不起作用.
我可以将Date值设置为什么,以便json.Marshal将其视为空(零)值并且不将其包含在json字符串中?
游乐场:http://play.golang.org/p/QJwh7yBJlo
实际结果:
{“Timestamp”:”2015-09-18T00:00:00Z”,”Date”:”0001-01-01T00:00:00Z”}
期望的结果:
{“Timestamp”:”2015-09-18T00:00:00Z”}
码:
- package main
- import (
- "encoding/json"
- "fmt"
- "time"
- )
- type MyStruct struct {
- Timestamp time.Time `json:",omitempty"`
- Date time.Time `json:",omitempty"`
- Field string `json:",omitempty"`
- }
- func main() {
- ms := MyStruct{
- Timestamp: time.Date(2015,9,18,time.UTC),Field: "",}
- bb,err := json.Marshal(ms)
- if err != nil {
- panic(err)
- }
- fmt.Println(string(bb))
- }
omitempty标签选项不适用于time.Time,因为它是一个结构.结构体有一个“零”值,但这是一个结构值,其中所有字段的值都为零.这是一个“有效”值,因此不会被视为“空”.
但是通过简单地将其更改为指针:* time.Time,它将起作用(对于json编组/解组,nil指针被视为“空”).所以在这种情况下不需要编写自定义Marshaler
:
- type MyStruct struct {
- Timestamp *time.Time `json:",omitempty"`
- Date *time.Time `json:",omitempty"`
- Field string `json:",omitempty"`
- }
使用它:
- ts := time.Date(2015,time.UTC)
- ms := MyStruct{
- Timestamp: &ts,}
输出(根据需要):
- {"Timestamp":"2015-09-18T00:00:00Z"}
如果您不能或不想将其更改为指针,您仍然可以通过实现自定义Marshaler
和Unmarshaler
来实现所需.如果这样做,您可以使用Time.IsZero()
方法来确定是否有时间. value是零值.