自定义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"}

 

posted @ 2020-04-28 09:54  zhangyu63  阅读(335)  评论(0编辑  收藏  举报