gpt4 book ai didi

JSON omitempty 带 time.Time 字段

转载 作者:IT老高 更新时间:2023-10-28 12:49:25 27 4
gpt4 key购买 nike

尝试 json Marshal 包含 2 个时间字段的结构。但我只希望该字段具有时间值(value)。所以我正在使用 json:",omitempty" 但它不起作用。

我可以将 Date 值设置为什么,以便 json.Marshal 将其视为空(零)值而不将其包含在 json 字符串中?

Playground :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, 0, 0, 0, 0, time.UTC),
Field: "",
}

bb, err := json.Marshal(ms)
if err != nil {
panic(err)
}
fmt.Println(string(bb))
}

最佳答案

omitempty 标签选项不适用于 time.Time,因为它是一个 struct。结构有一个“零”值,但这是一个所有字段都具有零值的结构值。这是一个“有效”值,因此不会被视为“空”。

但只需将其更改为指针:*time.Time,它就可以工作(nil 指针在 json 编码/解码时被视为“空”)。所以不需要写自定义Marshaler在这种情况下:

type MyStruct struct {
Timestamp *time.Time `json:",omitempty"`
Date *time.Time `json:",omitempty"`
Field string `json:",omitempty"`
}

使用它:

ts := time.Date(2015, 9, 18, 0, 0, 0, 0, time.UTC)
ms := MyStruct{
Timestamp: &ts,
Field: "",
}

输出(根据需要):

{"Timestamp":"2015-09-18T00:00:00Z"}

Go Playground 上试用.

如果您不能或不想将其更改为指针,您仍然可以通过实现自定义 Marshaler 来实现您想要的。和 Unmarshaler .如果这样做,您可以使用 Time.IsZero()判断 time.Time 值是否为零值的方法。

关于JSON omitempty 带 time.Time 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32643815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com