golang結構體json的時間格式化解決方案
最近開發專案時候發現一個結構體的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輸出格式與列印方式。
相關文章
- Golang結構體json的時間格式化解決辦法Golang結構體JSON
- golang json字串轉結構體GolangJSON字串結構體
- Golang操作結構體、Map轉化為JSONGolang結構體JSON
- [AI開發]基於DeepStream的視訊結構化解決方案AI
- Golang中的格式化時間輸出Golang
- iOS元件化解決方案iOS元件化
- oracle的interval時間格式的總結Oracle
- 模切企業的業財一體化解決方案
- 處理資料缺失的結構化解決辦法
- 企業IT運維開發一體化解決方案運維
- golang類和結構體Golang結構體
- 大螢幕實時資料視覺化解決方案?視覺化
- `newtonsoft.json` 指定某個屬性使用特定的時間格式JSON
- json結構體裡邊的刪除JSON結構體
- SQL SERVER資料庫檔案刪除、分割槽格式化解決方案SQLServer資料庫
- 基於 OpenYurt & EdgeX Foundry 的雲邊端一體化解決方案
- Android Native 記憶體洩漏系統化解決方案Android記憶體
- 前端微服務化解決方案4-新模組構建前端微服務
- linux下時間有關的函式和結構體Linux函式結構體
- Golang:將日誌以Json格式輸出到KafkaGolangJSONKafka
- 【時間戳轉普通時間格式的方法】時間戳
- [譯] part 16: golang 結構體structuresGolang結構體Struct
- Golang 學習——結構體 struct (一)Golang結構體Struct
- Golang 學習——結構體 struct (二)Golang結構體Struct
- 10 分鐘搞定 Golang 結構體Golang結構體
- iphone時間格式的支援iPhone
- [時間格式的轉換]
- win10如何修改時間日期格式 調整時間格式和日期格式的方法Win10
- 基於後編譯的國際化解決方案編譯
- golang 學習之路之 struct 結構體GolangStruct結構體
- Gin 框架 JSON 格式返回結果的使用方式框架JSON
- Golang 的 JSON 包GolangJSON
- 時間戳轉化為時間格式時間戳
- 理解Golang的Time結構Golang
- jackson時間格式的處理
- Go 之基礎速學 (七) golang 裡包的使用 JSON 化 struct 結構體以及 if else 的初次使用(二)GolangJSONStruct結構體
- 簡述元件化解決方案CTMediator與MGJRouter的主要思想元件化
- 智慧家居基於精益的數字化解決方案
- golang 時間加減Golang