对嵌入式结构使用自定义JSON封送处理()时出现问题

对嵌入式结构使用自定义JSON封送处理()时出现问题,json,struct,go,Json,Struct,Go,我试图定义一个自定义JSON封送器,以特定格式显示一些时间信息。理想情况下,我希望有一个存储创建/修改的值的结构,然后将它们嵌入需要跟踪该信息的结构中。此外,我想在JSON封送器中定义一个自定义日期格式,以便从客户端应用程序使用 我目前有两个结构 type Timestamp struct { Created time.Time Modified time.Time } type Company struct { Id string Name string

我试图定义一个自定义JSON封送器,以特定格式显示一些时间信息。理想情况下,我希望有一个存储创建/修改的值的结构,然后将它们嵌入需要跟踪该信息的结构中。此外,我想在JSON封送器中定义一个自定义日期格式,以便从客户端应用程序使用

我目前有两个结构

type Timestamp struct {
    Created time.Time
    Modified time.Time
}

type Company struct {
    Id string
    Name string
    Timestamp    
}
我想将时间戳结构嵌入到更新/创建项目时需要记录的对象中。没什么疯狂的

我的问题来自于我的定义

func (t Timestamp) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        CreatedFormatted string
    }{
        CreatedFormatted: t.Created.Format("Monday Jan _2 15:04:05 2006"),
    })
}

当我转到marshal
Company
时,我只看到时间戳的json,而没有看到公司的json。我本以为会显示公司结构的内容和时间戳结构。我在这里做错了什么吗?

通过在
公司
中嵌入
时间戳
,您不仅可以共享成员变量,还可以共享方法。这意味着您提供了
Company.marshalljson
方法,然后
json
包使用该方法来编组整个结构。为了查看所有字段,还需要为
公司
结构实现显式封送拆收器

如果您只想以特定的方式格式化时间戳,另一种解决方案是提供您自己的
time.time
,并在那里提供JSON封送器

例如:

type AccessTime time.Time

func (t AccessTime) MarshalJSON() ([]byte, error) {
    return json.Marshal(time.Time(t).Format("Monday Jan _2 15:04:05 2006"))
}

type Timestamp struct {
    Created  AccessTime
    Modified AccessTime
}

当结构中嵌入的类型提供方法时,该方法将成为嵌入结构的一部分。由于
公司
嵌入了
时间戳
时间戳
封送JSON
也可用于
公司
。当json想要封送一个
公司
时,它会看到它有一个
封送json
方法并调用它,而它找到的方法只封送时间戳字段。结构的默认行为(将每个字段封送到JSON对象中自己的键中)被重写

您可以做什么:

  • 不要使用结构嵌入,只需将
    时间戳
    作为常规字段(即使您将其声明为
    时间戳
    )。然后,
    Company
    将不会继承其方法,JSON将按预期工作(但您的代码中预期嵌入的其他部分可能会更改)。或:
  • Company
    它自己的
    MarshalJSON
    方法封送包括时间戳在内的所有字段。您可以通过
    A.将字段复制到与
    公司
    相同但没有嵌入的不同类型中,并对其进行编组。
    B将字段复制到映射并编组。
    C独立编组每个字段并粘贴字符串
    fmt.Sprintf(
    {“key1”:%s,“key2”:%s,…}
    ,m1,m2,…)