JSON Unmarshaling Format Masa Bukan RFC 3339 dalam Go
Gelagat lalai pakej pengekodan/json dalam Go adalah untuk mengawal dan nilai masa unmarshal dalam format RFC 3339. Walau bagaimanapun, bagaimana jika anda menemui data JSON dengan nilai masa dalam format yang berbeza?
Penyelesaian dengan Transformasi Manual
Satu pendekatan ialah menyahsiri nilai masa menjadi rentetan, mengubahnya secara manual menjadi format RFC 3339, dan kemudian gunakan json.Unmarshal sekali lagi. Semasa kaedah ini berfungsi, ia memperkenalkan overhed pemprosesan tambahan dan kod kekacauan.
Jenis Masa Tersuai
Penyelesaian yang lebih elegan adalah dengan melaksanakan json.Marshaler dan json.Unmarshaler antara muka pada jenis masa tersuai. Ini membenarkan pengendalian tersuai bagi siri dan penyahsirilan nilai masa.
Contoh Pelaksanaan
Berikut ialah contoh jenis masa tersuai bernama 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() }
Dalam jenis masa tersuai ini:
Penggunaan
Kini, anda boleh menggunakan jenis CustomTime dalam kod penyahserikatan JSON anda:
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()) }
Pendekatan ini membenarkan anda mengendalikan format masa bukan RFC 3339 dalam data JSON dengan elegan dan cekap tanpa menjejaskan fleksibiliti. Ia juga mempamerkan kuasa melaksanakan antara muka json.Marshaler dan json.Unmarshaler tersuai untuk mengendalikan pensirilan dan penyahsirilan jenis data.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Format Masa Bukan RFC 3339 dalam JSON Unmarshaling Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!