在Go中time.Time在转化成json的过程中会被转化成其他格式,而不是常见的时间格式。我们可以通过下面这种方法使time.Time在json序列化和反序列化时自定义实现。同理,其他类型可以仿造这种方式实现。
package main
import (
"encoding/json"
"fmt"
"time"
)
// 设置时间格式
const (
timeFormat = "2006-01-02 15:04:05"
)
// 自定义类型
type JsonDate time.Time
// JsonDate反序列化
func (t *JsonDate) UnmarshalJSON(data []byte) (err error) {
newTime, err := time.ParseInLocation("\""+timeFormat+"\"", string(data), time.Local)
*t = JsonDate(newTime)
return
}
// JsonDate序列化
func (t JsonDate) MarshalJSON() ([]byte, error) {
timeStr := fmt.Sprintf("\"%s\"", time.Time(t).Format(timeFormat))
return []byte(timeStr),nil
}
// string方法
func (t JsonDate) String() string {
return time.Time(t).Format(timeFormat)
}
// 定义User结构体
type User struct {
UserName string `json:"user_name"`
Sex bool `json:"sex"`
BirthDay time.Time `json:"birth_day"`
Age int `json:"age"`
Score float64 `json:"score"`
StartWorkDate JsonDate `json:"start_work_date"`
}
func main() {
// 转json
Serial()
// json转struct
UnSerial()
}
// 序列化成Json
func Serial() {
user := User{
UserName: "Mac",
Sex: false,
BirthDay: time.Now(),
Age: 18,
Score: 95.8,
StartWorkDate: JsonDate(time.Now()),
}
jsonByte, err := json.Marshal(user)
if err != nil {
fmt.Println("json serial err: ", err.Error())
}
fmt.Println(string(jsonByte))
}
// 反序列化成对象
func UnSerial() {
str := `{"user_name":"Mac","sex":false,"birth_day":"2020-02-28T18:13:59.738342443+08:00","age":18,"score":95.8,"start_work_date":"2020-02-28 18:13:59"}`
user := new(User)
err := json.Unmarshal([]byte(str), user)
if err != nil {
fmt.Println("json unSerial err: ",err.Error())
}
fmt.Printf("%+v\n",user)
}






网友评论