当前位置: 首页 > 面试题库 >

JSON时空性带time.Time字段

庄新翰
2023-03-14
问题内容

尝试对包含2个时间字段的结构进行JSON编组。但我只希望该字段具有时间值才能通过。所以我正在使用,json:",omitempty"但是没有用。

我该如何将Date值设置为json.Marshal会将其视为空(零)值并且不将其包含在json字符串中?

游乐场:http://play.golang.org/p/QJwh7yBJlo

实际结果:

{“时间戳记”:“ 2015-09-18T00:00:00Z”,“日期”:“ 0001-01-01T00:00:00Z”}

期望的结果:

{“时间戳记”:“ 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上尝试一下。

如果您不能或不想将其更改为指针,则仍可以通过实现custom
Marshaler和来实现所需的功能Unmarshaler。如果这样做,则可以使用该Time.IsZero()方法来确定一个time.Time值是否为零值。



 类似资料:
  • 描述 (Description) 方法time()将时间作为以UTC为单位以秒为单位表示的浮点数返回。 Note - 即使始终将时间作为浮点数返回,并非所有系统都提供精度高于1秒的时间。 虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。 语法 (Syntax) 以下是time()方法的语法 - time.time() 参数 (Parameters)

  • 我正在spring boot开发小型REST应用程序。我想执行test Controller(post.method)向数据库添加新对象。 我通过构造函数创建新实体,并在对象中指定字段。然后我通过mockmvc保存这个对象。并且有一个问题,MockMvc保存了我的对象,但是所有的字段都是null或者false。控制器使用的服务经过测试并正常工作 控制器: 实体: 测试类: 系统输出打印结果: Mo

  • 问题内容: 在Python中使用哪个计时更好?)或?哪一个提供更高的准确性? 例如: 与 问题答案: 作为已被弃用,并且它建议使用或来代替。 早于2.7,根据时间模块docs: 在Unix上,以秒为单位返回当前处理器时间,以浮点数表示。精度(实际上是“处理器时间”的含义的确切定义)取决于同名C函数的精度,但是无论如何,这是用于基准化Python或计时算法的函数。 在Windows上,此函数将基于W

  • 问题内容: 我正在尝试将数据库中的一些值添加到Go中。其中一些是时间戳。 我得到错误: 不能在数组元素中使用U.Created_date(类型time.Time)作为类型字符串 我可以转换成吗? -- 编辑 我添加了以下内容。现在可以了,谢谢。 问题答案: 您可以使用方法将转换为。这使用格式字符串。 如果您需要其他自定义格式,则可以使用。例如,使用格式字符串获取时间戳的格式。 例: 输出(在Go

  • 问题内容: 我正在订购我的数据,并且其工作正常,但某些字段为空或没有值。订购时,这些空字段首先出现。例如,当订购数字时,我们将在获得“ 0”值之前得到一个巨大的空列表。 我这样做是这样的: 和 JSFiddle:http : //jsfiddle.net/JZuCX/1/ 有没有简单而优雅的方法可以解决此问题?无论什么情况,我都希望空白字段排在最后。 问题答案: 我要编写一个过滤器,该过滤器从有序

  • 问题内容: 有时候,我想花点时间运行我的代码的一部分。我已经检查了许多在线站点,并大致看到了两种主要方法。一个正在使用,另一个正在使用。 因此,我编写了一个非常简单的脚本来比较两者: 基本上,它乘以在for循环中打印“ ABC” 100次所需的时间。左边的数字是的结果,右边的数字是: 如您所见,有时time.time更快,有时更慢。哪种方法更好(更准确)? 问题答案: 更准确,原因有以下三个: 它