起因:從MongoDB中獲取的時(shí)間戳字段在轉(zhuǎn)換成JSON時(shí)不符合需求。需要對(duì)這個(gè)字段定制一下塘淑,轉(zhuǎn)換成需要的字符串萝招。
解決方案:
- 最直接的方案就是,對(duì)讓對(duì)應(yīng)的
struct
實(shí)現(xiàn)MarshalJSON
這個(gè)方法存捺,自己生成整個(gè)JSON字符串槐沼, 碰到需要定制的字段,再自行更改捌治。
示例代碼如下:Code From
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
}
- 還有一種方法就是使用輔助
struct
岗钩,這樣寫起來(lái)可能比上面的輕松一些。
示例代碼如下:Code From
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(),
})
}
- 不過(guò)如果字段很多時(shí)候肖油,就可能要寫很長(zhǎng)兼吓,但我們只需要更改某些字段。那么可以使用別名
struct
森枪,寫出更簡(jiǎn)短的代碼视搏。為什么要為struct
起個(gè)別名呢?因?yàn)槿绻苯邮褂迷瓉?lái)的struct
县袱,那么輔助的struct
也會(huì)繼承原來(lái)的MarshalJSON方法浑娜,這樣就成為一個(gè)無(wú)限循環(huán)了。
示例代碼如下:Code From
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
這個(gè)方法返回的是[]byte
式散,所以如果想打印出來(lái)或者使用字符串筋遭,需要進(jìn)行轉(zhuǎn)換string(result)
,否則就會(huì)出現(xiàn)鏈接中的問(wèn)題