golang構造体jsonの時間フォーマットソリューション
2602 ワード
プロジェクト開発では、構造体のJson変換の時間フォーマットの問題に遭遇することがあります.すなわち、この1993-01-01 T 20:08:23.0000028+08:00というUTCメソッドを表す.私たちの習慣から言えば、もっと好きなのは1993-01-01 20:08:23というフォーマットです.再現コードは次のとおりです.
このような問題に遭遇した場合、Golangはどのように解決したのでしょうか.2つのソリューションがありますが、次は1つずつ見てみましょう.
第1の方法に比べて、この方法は複雑に見えます.
この方法はGolangの構造体の組合せ方式を用い,OOPの継承を実現することができ,Golangの柔軟性を体現するものでもある.
任意のstructに対してMarshalJSON,UnmarshalJSON,Stringメソッドを追加し,カスタムjson出力フォーマットと印刷方式を実現する.
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はどのように解決したのでしょうか.2つのソリューションがありますが、次は1つずつ見てみましょう.
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"}
}
構造体の組み合わせの使用
第1の方法に比べて、この方法は複雑に見えます.
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の柔軟性を体現するものでもある.
任意のstructに対してMarshalJSON,UnmarshalJSON,Stringメソッドを追加し,カスタムjson出力フォーマットと印刷方式を実現する.