Apabila menggunakan pakej pengekodan/json dalam Go, tingkah laku lalai untuk menyahmarshaling nilai masa adalah untuk mematuhi format RFC 3339 dengan ketat. Walau bagaimanapun, bagaimana jika anda menemui format masa yang menyimpang daripada piawai ini?
Untuk mengendalikan situasi sedemikian, anda boleh melaksanakan antara muka json.Marshaler dan json.Unmarshaler pada tersuai menaip. Ini membolehkan anda mentakrifkan logik pengekodan dan penyahkodan tersuai untuk format masa khusus anda.
Berikut ialah contoh jenis Masa Tersuai:
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() }
Untuk menggunakan jenis CustomTime, anda boleh membenamkannya sebagai medan dalam a struct:
type Args struct { Time CustomTime }
Berikut ialah contoh cara menggunakan Args struct dan jenis CustomTime untuk menyahmarshal rentetan JSON yang mengandungi format masa bukan RFC 3339:
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()) }
Output:
<nil> 2014-08-01 11:27:18 +0000 UTC
Dengan melaksanakan jenis CustomTime tersuai, anda boleh mengendalikan penyahserialisasian format masa yang bukan dalam format RFC 3339.
Atas ialah kandungan terperinci Bagaimana untuk Menyahserialisasi Format Masa Bukan RFC 3339 dalam Go dengan `pengekodan/json`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!