对嵌入式结构使用自定义JSON封送处理()时出现问题
我试图定义一个自定义JSON封送器,以特定格式显示一些时间信息。理想情况下,我希望有一个存储创建/修改的值的结构,然后将它们嵌入需要跟踪该信息的结构中。此外,我想在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
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,…)