本篇在项目中实用性极强,推荐珍藏
package main
import (
"encoding/json"
"fmt"
"time"
)
type JsonDate time.Time
type JsonTime time.Time
func (p *JsonDate) UnmarshalJSON(data []byte) error {
local,err := time.ParseInLocation(`"2006-01-02"`,string(data),time.Local)
*p = JsonDate(local)
return err
}
func (p *JsonTime) UnmarshalJSON(data []byte) error {
local,err := time.ParseInLocation(`"2006-01-02 15:04:05"`,time.Local)
*p = JsonTime(local)
return err
}
func (c JsonDate) MarshalJSON() ([]byte,error) {
data := make([]byte,0)
data = append(data,'"')
data = time.Time(c).AppendFormat(data,"2006-01-02")
data = append(data,'"')
return data,nil
}
func (c JsonTime) MarshalJSON() ([]byte,"2006-01-02 15:04:05")
data = append(data,nil
}
func (c JsonDate) String() string {
return time.Time(c).Format("2006-01-02")
}
func (c JsonTime) String() string {
return time.Time(c).Format("2006-01-02 15:04:05")
}
func Todate(in string) (out time.Time,err error) {
out,err = time.Parse("2006-01-02",in)
return out,err
}
func Todatetime(in string) (out time.Time,err = time.Parse("2006-01-02 15:04:05",err
}
type Human struct {
Id int64 `json:"id"`
Name string `json:"name"`
Birthday JsonTime `json:"birthday"` //注意:日期带时分秒这样的格式,日期部分yyyy-MM-dd不能使用带斜线的格式
}
type Employee struct {
Id int64 `json:"id"`
Name string `json:"name"`
Birthday JsonDate `json:"birthday"` //注意:日期格式yyyy-MM-dd,日期不能使用带斜线的格式
}
func main() {
now := JsonTime(time.Now())
fmt.Println("当前时间:",now)
fmt.Println("========================================================================")
Tom := `{"id":5,"name":"Tom","birthday":"2016-06-30 16:09:51"}`
human := new(Human)
//json使用struct对象来解码 ------ json转struct对象
err1 := json.Unmarshal([]byte(Tom),&human)
if err1 != nil {
fmt.Println(err1)
}
fmt.Println("json转struct对象: ",*human)
fmt.Println("struct对象时间字段:",human.Birthday)
fmt.Println(time.Time(human.Birthday))
fmt.Println("========================================================================")
//struct对象使用json编码 ------ struct对象转json
data1,_ := json.Marshal(human)
fmt.Println("struct对象转json:",string(data1))
fmt.Println("\n\n")
fmt.Println("***********************************************************************************************")
fmt.Println("***********************************************************************************************")
Jack := `{"id":8,"name":"Jack","birthday":"2016-06-30"}`
employee := Employee{}
//json使用struct对象来解码 ------ json转struct对象
err2 := json.Unmarshal([]byte(Jack),&employee)
if err2 != nil {
fmt.Println(err2)
}
fmt.Println("json转struct对象: ",employee)
fmt.Println("struct对象时间字段:",employee.Birthday)
fmt.Println(time.Time(employee.Birthday))
fmt.Println("========================================================================")
//struct对象使用json编码 ------ struct对象转json
data2,_ := json.Marshal(employee)
fmt.Println("struct对象转json:",string(data2))
fmt.Println("\n\n")
JsonData := `[{"id":15,"name":"Jason","birthday":"1986-06-14"},{"id":16,"name":"Tim","birthday":"1986-12-06"}]`
var empList []Employee //定义一个切片
//json使用struct对象来解码 ------ json转struct对象
err3 := json.Unmarshal([]byte(JsonData),&empList)
if err3 != nil {
fmt.Println(err3)
}
fmt.Println("json转struct对象: ",empList)
fmt.Println("struct对象时间字段:",empList[1].Birthday)
fmt.Println(time.Time(empList[1].Birthday))
fmt.Println("========================================================================")
employees := make([]Employee,0) //定义一个切片
var date time.Time
var err4 error
date,err4 = Todate("1986-06-14") //字符串转time.Time类型
if err4 != nil {
fmt.Println(err4)
return
}
jason := Employee{Id: 15,Name: "Jason",Birthday: JsonDate(date)} //Birthday: JsonDate(date),注意键值对赋值方式
date,err4 = Todate("1986-12-06") //字符串转time.Time类型
if err4 != nil {
fmt.Println(err4)
return
}
tim := Employee{Id: 16,Name: "Tim",Birthday: JsonDate(date)}
employees = append(employees,jason)
employees = append(employees,tim)
//struct对象使用json编码 ------ struct对象转json
data3,_ := json.Marshal(employees)
fmt.Println("struct对象集合转json:",string(data3))
fmt.Println("\n\n")
}
控制台打印输出:
2017/06/25 05:37:59 server.go:73: Using API v1 2017/06/25 05:37:59 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/hello/debug] API server listening at: 127.0.0.1:2345 2017/06/25 05:37:59 debugger.go:505: continuing 当前时间: 2017-06-25 05:37:59 ======================================================================== json转struct对象: {5 Tom 2016-06-30 16:09:51} struct对象时间字段: 2016-06-30 16:09:51 2016-06-30 16:09:51 +0800 CST ======================================================================== struct对象转json: {"id":5,"birthday":"2016-06-30 16:09:51"} *********************************************************************************************** *********************************************************************************************** json转struct对象: {8 Jack 2016-06-30} struct对象时间字段: 2016-06-30 2016-06-30 00:00:00 +0800 CST ======================================================================== struct对象转json: {"id":8,"birthday":"2016-06-30"} json转struct对象: [{15 Jason 1986-06-14} {16 Tim 1986-12-06}] struct对象时间字段: 1986-12-06 1986-12-06 00:00:00 +0800 CST ======================================================================== struct对象集合转json: [{"id":15,"birthday":"1986-12-06"}]