Go自定义MarshalJSON
遇到一个问题,需要对空结构体序列化,但是空数组序列化结果是null,如果是空结构体可以用omitempty,但是这是数组,序列化就没了
type Server []struct {
IP string `json:"IP"`
Version string `json:"Version"`
}
BI struct {
Port string `json:"Port"`
ExternalURL string `json:"ExternalURL"`
Path string `json:"Path"`
Server Server `json:"Server"`
}
搜到了一种实现方式, 可以通过自定义 MarshalJSON 来实现
type MyUser struct {
ID int64 `json:"id"`
Name string `json:"name"`
LastSeen time.Time `json:"lastSeen"`
}
type Alias MyUser
func (u *MyUser) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
LastSeen int64 `json:"lastSeen"`
*Alias
}{
LastSeen: u.LastSeen.Unix(),
Alias: (*Alias)(u),
})
}
_ = json.NewEncoder(os.Stdout).Encode(
&MyUser{1, "Ken", time.Now()},
)
最后决定这样解决
type ServerCopy Server
func (s Server) MarshalJSON() ([]byte, error) {
if len(s) == 0 {
return []byte("[]"), nil
}
c := ServerCopy(s)
return json.Marshal(c)
}