91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang結構體json的時間格式化解決方案

發布時間:2020-06-17 17:02:08 來源:網絡 閱讀:3281 作者:夢朝思夕 欄目:編程語言

最近開發項目時候發現一個結構體的Json轉換的時間格式問題。

即這種1993-01-01T20:08:23.000000028+08:00 這種表示UTC方法。從我們習慣來說,更喜歡希望的是

1993-01-01 20:08:23這種格式。

重新復現代碼如下:

package main

import (
    "time"
    "encoding/json"
)

type Student struct {
    Name string     `json:"name"`
    Brith time.Time `json:"brith"`
}

func main()  {
    stu:=Student{
        Name:"qiangmzsx",
        Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local),
    }

    b,err:=json.Marshal(stu)
    if err!=nil {
        println(err)
    }

    println(string(b))//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"}
}

遇到這樣的問題,那么Golang是如何解決的呢?

有兩種解決方案,下面我們一個個來看看。

通過time.Time類型別名

type JsonTime time.Time
// 實現它的json序列化方法
func (this JsonTime) MarshalJSON() ([]byte, error) {
    var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05"))
    return []byte(stamp), nil
}
type Student1 struct {
    Name string     `json:"name"`
    Brith JsonTime  `json:"brith"`
}
func main()  {

    stu1:=Student1{
        Name:"qiangmzsx",
        Brith:JsonTime(time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local)),
    }
    b1,err:=json.Marshal(stu1)
    if err!=nil {
        println(err)
    }

    println(string(b1))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}
}

使用結構體組合方式

相較于第一種方式,該方式顯得復雜一些,我也不是很推薦使用,就當做是一個擴展教程吧。

type Student2 struct {
    Name string     `json:"name"`
    // 一定要將json的tag設置忽略掉不解析出來
    Brith time.Time  `json:"-"`
}
// 實現它的json序列化方法
func (this Student2) MarshalJSON() ([]byte, error) {
    // 定義一個該結構體的別名
    type AliasStu Student2
    // 定義一個新的結構體
    tmpStudent:= struct {
        AliasStu
        Brith string `json:"brith"`
    }{
        AliasStu:(AliasStu)(this),
        Brith:this.Brith.Format("2006-01-02 15:04:05"),
    }
    return json.Marshal(tmpStudent)
}
func main()  {
    stu2:=Student2{
        Name:"qiangmzsx",
        Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local),
    }

    b2,err:=json.Marshal(stu2)
    if err!=nil {
        println(err)
    }

    println(string(b2))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}
}

該方法使用了Golang的結構體的組合方式,可以實現OOP的繼承,也是體現Golang靈活。


下面把上面的代碼組成整體貼出來。

package main

import (
    "time"
    "encoding/json"
    //"fmt"
    "fmt"
)

type Student struct {
    Name string     `json:"name"`
    Brith time.Time `json:"brith"`
}

type JsonTime time.Time
// 實現它的json序列化方法
func (this JsonTime) MarshalJSON() ([]byte, error) {
    var stamp = fmt.Sprintf("\"%s\"", time.Time(this).Format("2006-01-02 15:04:05"))
    return []byte(stamp), nil
}
type Student1 struct {
    Name string     `json:"name"`
    Brith JsonTime  `json:"brith"`
}

type Student2 struct {
    Name string     `json:"name"`
    // 一定要將json的tag設置忽略掉不解析出來
    Brith time.Time  `json:"-"`
}
// 實現它的json序列化方法
func (this Student2) MarshalJSON() ([]byte, error) {
    // 定義一個該結構體的別名
    type AliasStu Student2
    // 定義一個新的結構體
    tmpStudent:= struct {
        AliasStu
        Brith string `json:"brith"`
    }{
        AliasStu:(AliasStu)(this),
        Brith:this.Brith.Format("2006-01-02 15:04:05"),
    }
    return json.Marshal(tmpStudent)
}


func main()  {
    stu:=Student{
        Name:"qiangmzsx",
        Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local),
    }

    b,err:=json.Marshal(stu)
    if err!=nil {
        println(err)
    }

    println(string(b))//{"name":"qiangmzsx","brith":"1993-01-01T20:08:23.000000028+08:00"}


    println("===================")

    stu1:=Student1{
        Name:"qiangmzsx",
        Brith:JsonTime(time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local)),
    }
    b1,err:=json.Marshal(stu1)
    if err!=nil {
        println(err)
    }

    println(string(b1))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}

    println("===================")
    stu2:=Student2{
        Name:"qiangmzsx",
        Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.Local),
    }

    b2,err:=json.Marshal(stu2)
    if err!=nil {
        println(err)
    }

    println(string(b2))//{"name":"qiangmzsx","brith":"1993-01-01 20:08:23"}
}

值得一提的是,對任意struct增加  MarshalJSON ,UnmarshalJSON , String 方法,實現自定義json輸出格式與打印方式。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邳州市| 丘北县| 治多县| 娄底市| 瑞昌市| 洛扎县| 天全县| 西平县| 延寿县| 景东| 志丹县| 噶尔县| 桐柏县| 南皮县| 垫江县| 乐昌市| 北宁市| 郎溪县| 迭部县| 海门市| 泌阳县| 陆河县| 普安县| 额敏县| 财经| 龙海市| 浙江省| 祁阳县| 汶川县| 柳州市| 华安县| 西丰县| 滦南县| 花莲市| 儋州市| 信宜市| 社旗县| 蛟河市| 玛曲县| 乐安县| 潞城市|