自定义Json序列化
link
http://choly.ca/post/go-json-marshalling/
https://zhuanlan.zhihu.com/p/27472716
玩法还是蛮多的,如果能理解反射就好了。我们不能每次为了特定json返回而改原始的struct,我们直接从出口入手。
type MyUser struct { ID int64 `json:"id"` Name string `json:"name"` LastSeen time.Time `json:"last_seen"` } func main() { _ = json.NewEncoder(os.Stdout).Encode( &MyUser{ID:1, Name:"ken", LastSeen:time.Now()}) } //func (u *MyUser) MarshalJSON() ([]byte, error) { // return json.Marshal(&struct { // ID int64 `json:"id"` // Name string `json:"name"` // LastSeen int64 `json:"lastSeen"` // }{ // ID: u.ID, // Name: u.Name, // LastSeen: u.LastSeen.Unix(), // }) //} func (u *MyUser) MarshalJSON() ([]byte, error) { type Alias MyUser return json.Marshal(&struct { lastSeen int64 `json:"lastSeen"` Name string `json:"name,omitempty"` *Alias }{ lastSeen: u.LastSeen.Unix(), Alias: (*Alias)(u), }) }
这里我们的自定义的目的是多加一个特定格式的time json字段,且把name屏蔽掉。
{"id":1,"last_seen":"2020-04-28T09:48:18.9537416+08:00"}
一个没有高级趣味的人。
email:hushui502@gmail.com