先定義類型
實(shí)現(xiàn) MarshalJSON
和 UnmarshalJSON
函數(shù)
json.MarshalJSON 是用于轉(zhuǎn)換為 json
json.UnmarshalJSON 用于解析值
如果在調(diào)用 json.UnmarshalJSON(jsonStr, &A{})
進(jìn)行解析值的時(shí)候,那么就會(huì)調(diào)用該類型實(shí)現(xiàn)的 UnmarshalJSON
函數(shù)敛摘,也就是說(shuō)實(shí)現(xiàn) MarshalJSON
和 UnmarshalJSON
函數(shù)乳愉,我們可以自由的實(shí)現(xiàn) json
的類型轉(zhuǎn)換
package types
import (
"database/sql"
"encoding/json"
"strconv"
"time"
)
// json 轉(zhuǎn)換 時(shí)間
type NullTime struct {
sql.NullTime
}
// MarshalJSON 轉(zhuǎn)換為 json
func (nt *NullTime) MarshalJSON(value interface{}) ([]byte, error) {
if nt.Valid {
return json.Marshal(nt.Time)
} else {
return json.Marshal(nil)
}
}
// UnmarshalJSON 獲取值
func (nt *NullTime) UnmarshalJSON(data []byte) error {
var s *time.Time
timeStr, _ := UnixToTime(string(data))
s = &timeStr
//if err := json.Unmarshal([]byte(timeStr)., &s); err != nil {
// return err
//}
if s != nil {
nt.Valid = true
nt.Time = *s
} else {
nt.Valid = false
}
return nil
}
func UnixToTime(e string) (datatime time.Time, err error) {
data, err := strconv.ParseInt(e, 10, 64)
datatime = time.Unix(data/1000, 0)
return
}
使用定義好的類型
package params
import (
"go-press/types"
)
type Base struct {
Page int `form:"page" json:"page"`
Size int `form:"size" json:"size"`
StartDate types.NullTime `form:"start_date" json:"start_date"`
EndDate types.NullTime `form:"end_date" json:"end_date"`
}
那么在使用 json 轉(zhuǎn)換的時(shí)候就會(huì)轉(zhuǎn)換為我們要的值
base := &Base{}
json.UnmarshalJSON(jsonStr, base)