您的位置:首页 > Web前端 > JavaScript

Golang 奇葩的时间包之Json与struct对象之间互相转换,JsonDate和JsonTime自定义类型如何实现json编码和解码(二)

2017-06-25 06:07 1616 查看
本篇在项目中实用性极强,推荐珍藏

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"`, string(data), 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, error) {

    data := make([]byte, 0)

    data = append(data, '"')

    data = time.Time(c).AppendFormat(data, "2006-01-02 15:04:05")

    data = append(data, '"')

    return 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 error) {

    out, err = time.Parse("2006-01-02 15:04:05", in)

    return out, 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,"name":"Tom","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,"name":"Jack","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,"name":"Jason","birthday":"1986-06-14"},{"id":16,"name":"Tim","birthday":"1986-12-06"}]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐