加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang JSON omitempty with time.Time Field

发布时间:2020-12-16 19:21:08 所属栏目:大数据 来源:网络整理
导读:试图让json Marshal包含2个时间字段的结构.但是如果它有时间价值,我只希望该字段能够通过.所以我正在使用json:“,omitempty”但它不起作用. 我可以将Date值设置为什么,以便json.Marshal将其视为空(零)值并且不将其包含在json字符串中? 游乐场:http://play
试图让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"}

试试Go Playground.

如果您不能或不想将其更改为指针,您仍然可以通过实现自定义MarshalerUnmarshaler来实现所需.如果这样做,您可以使用Time.IsZero()方法来确定是否有时间. value是零值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读