Go JSON 中非RFC 3339 時間格式的自訂解組
在Go 中,encoding/json 包嚴格遵守RFC 3339,當反序列化時間值。然而,經常會出現資料採用不同時間格式的情況。如果您想避免繁瑣的轉換,這可能會成為問題。
使用自訂類型
要處理此問題,您可以實作 json.Marshaler 和 json.Unmarshaler 介面在自訂類型上。這允許您定義如何對您的類型進行編組和從 JSON 進行編組。
例如,以下CustomTime 類型可讓您從各種格式中解組時間值:
type CustomTime struct { time.Time } const ctLayout = "2006/01/02|15:04:05" func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) { s := strings.Trim(string(b), "\"") if s == "null" { ct.Time = time.Time{} return } ct.Time, err = time.Parse(ctLayout, s) return } func (ct *CustomTime) MarshalJSON() ([]byte, error) { if ct.Time.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil } var nilTime = (time.Time{}).UnixNano() func (ct *CustomTime) IsSet() bool { return !ct.IsZero() }
In這種類型:
您可以在JSON 結構中使用CustomTime 類型來處理非RFC 3339 格式的時間值:
type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} fmt.Println(json.Unmarshal([]byte(data), &a)) fmt.Println(a.Time.String()) }
在此範例中,Args 結構體對Time 欄位使用CustomTime類型。當使用非 RFC 3339 時間格式反序列化 JSON 資料時,CustomTime 類型將正確處理轉換。
以上是如何在 Go JSON 解組中處理非 RFC 3339 時間格式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!