我正在尝试定义一个自定义 JSON 封送拆收器来以特定格式显示一些时间信息。理想情况下,我想要一个结构来存储创建/修改的值,然后将它们嵌入到需要跟踪该信息的结构中。此外,我想在 JSON 封送拆收器中定义自定义日期格式,以便在客户端应用程序中使用。
我目前有两个结构
type Timestamp struct {
Created time.Time
Modified time.Time
}
type Company struct {
Id string
Name string
Timestamp
}
Run Code Online (Sandbox Code Playgroud)
我想将 Timestamp 结构嵌入到更新/创建项目时需要记录的对象中。那里没有什么疯狂的。
当我定义时,我的问题就出现了
func (t Timestamp) MarshalJSON() ([]byte, error) {
return json.Marshal(struct {
CreatedFormatted string
}{
CreatedFormatted: t.Created.Format("Monday Jan _2 15:04:05 2006"),
})
}
Run Code Online (Sandbox Code Playgroud)
当我去 marshal 时Company,我只看到时间戳的 json,但没有看到公司的任何内容。我原以为会显示Company 结构和Timestamp 结构的内容。我在这里做错了吗?
当嵌入在结构中的类型提供方法时,该方法成为嵌入结构的一部分。由于Companyembeds Timestamp,Timestamp'sMarshalJSON也可用于Company。当 json 正在寻找编组 a 时,Company它看到它有一个MarshalJSON方法并调用它——而它找到的方法只编组了时间戳字段。结构的默认行为(将每个字段编组为 JSON 对象中的自己的键)被覆盖。
你可以做什么:
Timestamp一个常规字段(即使您将其声明为Timestamp Timestamp)。然后Company不会继承其方法并且 JSON 将按预期工作(但您的代码中期望嵌入的其他部分可能会更改)。或者:Company自己的MarshalJSON方法来编组包括时间戳在内的所有字段。你可以做到这一点Company嵌入相同但没有嵌入的不同类型中,并对其进行编组。fmt.Sprintf({"key1":%s,"key2":%s,...}, m1, m2, ...)| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |