Administrator
发布于 2023-12-29 / 2 阅读
0

Go自定义MarshalJSON

#Go

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)
}