在Golang中,encoding/json.Marshal函數通常用於將物件轉換為JSON。但是,在預設設定下,它可能與所需的 JSON 佈局不一致。本文介紹了一種覆寫預設佈局並自訂 JSON 編組期間 time.Time 欄位所使用的格式的解決方案。
假設您有一個 struct ,其中包含名為 starttime 的 time.Time 欄位。將此結構編組為 JSON 時,您需要使用特定的自訂佈局。
s := {"starttime":time.Now(), "name":"ali"}
為了實現這一點,我們可以建立一個嵌入time.Time 的自訂類型並覆蓋MarshalText 和MarshalJSON 方法。
import "fmt"
import "time"
import "encoding/json"
type jsonTime struct {
time.Time
f string
}
func (j jsonTime) format() string {
return j.Time.Format(j.f)
}
func (j jsonTime) MarshalText() ([]byte, error) {
return []byte(j.format()), nil
}
func (j jsonTime) MarshalJSON() ([]byte, error) {
return []byte(`"` j.format() `"`), nil
}
透過重寫 MarshalText,我們控制 jsonTime 類型如何將其值轉換為文字形式,從而允許我們指定自訂佈局。此外,透過重寫 MarshalJSON,我們確保使用重寫的方法而不是內建 time.Time 實作 JSON 編組。
使用自訂 jsonTime 類型,您現在可以使用所需的佈局編組您的 s 結構:
jt := jsonTime{time.Now(), time.Kitchen}
x := map[string]interface{}{
"foo": jt,
"bar": "baz",
}
data, err := json.Marshal(x)
if err != nil {
panic(err)
}
這將產生一個 JSON 字串,其中 starttime 欄位的格式根據 time.Kitchen 佈局而定。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3