2 回答
TA贡献1765条经验 获得超5个赞
当嵌入在结构中的类型提供方法时,该方法成为嵌入结构的一部分。由于Company
embeds Timestamp
,Timestamp
'sMarshalJSON
也可用于Company
。当 json 正在寻找编组 a 时,Company
它看到它有一个MarshalJSON
方法并调用它——而它找到的方法只编组了时间戳字段。结构的默认行为(将每个字段编组为 JSON 对象中的自己的键)被覆盖。
你可以做什么:
不要使用结构嵌入,只需创建
Timestamp
一个常规字段(即使您将其声明为Timestamp Timestamp
)。然后Company
不会继承其方法,JSON 将按预期工作(但您的代码的其他部分希望嵌入可能会更改)。或者:给出
Company
自己的MarshalJSON
方法来编组包括时间戳在内的所有字段。你可以做到这一点
。将字段复制到与Company
嵌入相同但没有嵌入的不同类型中,并对其进行编组。
湾 将字段复制到地图中并对其进行编组。
C。独立编组每个字段并自己粘贴字符串。fmt.Sprintf(
{"key1":%s,"key2":%s,...}
, m1, m2, ...)
TA贡献1850条经验 获得超11个赞
通过嵌入Timestamp,Company您不仅可以共享成员变量,还可以嵌入方法。这意味着您提供了Company.MarshalJSON方法,然后json包使用它来编组整个结构。为了查看所有字段,您还需要为Company结构实现显式封送拆收器。
如果您只想以特定方式格式化时间戳,另一种解决方案是提供您自己的time.Time并在那里提供 JSON marshaller。
例如:
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
}
https://play.golang.org/p/PhZXPauSyz
- 2 回答
- 0 关注
- 174 浏览
添加回答
举报