Gopher

Go -- 定制Marshal JSON的部分字段

2019-05-15  本文已影响0人  李书文

起因:从MongoDB中获取的时间戳字段在转换成JSON时不符合需求。需要对这个字段定制一下,转换成需要的字符串。

解决方案:

func (this Stuff) MarshalJSON() ([]byte, error) {
    buffer := bytes.NewBufferString("{")
    length := len(this)
    count := 0
    for key, value := range this {
        jsonValue, err := json.Marshal(value)
        if err != nil {
            return nil, err
        }
        buffer.WriteString(fmt.Sprintf("\"%d\":%s", key, string(jsonValue)))
        count++
        if count < length {
            buffer.WriteString(",")
        }
    }
    buffer.WriteString("}")
    return buffer.Bytes(), nil
}
type MyUser struct {
    ID       int64     `json:"id"`
    Name     string    `json:"name"`
    LastSeen time.Time `json:"lastSeen"`
}

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(),
    })
}
type MyUser struct {
    ID       int64     `json:"id"`
    Name     string    `json:"name"`
    LastSeen time.Time `json:"lastSeen"`
}

func (u *MyUser) MarshalJSON() ([]byte, error) {
    type Alias MyUser
    return json.Marshal(&struct {
        LastSeen int64 `json:"lastSeen"`
        *Alias
    }{
        LastSeen: u.LastSeen.Unix(),
        Alias:    (*Alias)(u),
    })
}

注意⚠️
MarshalJSON这个方法返回的是[]byte,所以如果想打印出来或者使用字符串,需要进行转换string(result),否则就会出现链接中的问题

上一篇 下一篇

猜你喜欢

热点阅读