JSON Unmarshaling Go mempunyai masalah dengan datetimes yang diformatkan mengikut ISO8601/RFC3339 yang mempunyai offset zon waktu format 0200 dan bukannya 02:00.
Format JSON Salah:
2016-08-08T21:35:14.052975+0200
Format Betul Dijangka:
2016-08-08T21:35:14.052975+02:00
Punca Berkemungkinan:
JSON telah dijana menggunakan fungsi strftime C dengan rentetan format yang tidak termasuk titik bertindih dalam ofset zon waktu.
Untuk menyelesaikan isu ini dan mendayakan penyahmarshalan yang betul bagi kedua-dua format, jenis medan masa tersuai boleh ditakrifkan:
<code class="go">type MyTime struct { time.Time } func (self *MyTime) UnmarshalJSON(b []byte) (err error) { s := string(b) // Remove double quotes from JSON value s = s[1:len(s)-1] t, err := time.Parse(time.RFC3339Nano, s) if err != nil { t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s) } self.Time = t return }</code>
Dalam jenis tersuai ini, kaedah UnmarshalJSON cuba untuk menghuraikan rentetan mengikut kedua-dua RFC3339Nano (dengan titik bertindih dalam offset zon waktu) dan versi RFC3339Nano yang diubah suai tanpa titik bertindih.
Untuk menggunakan jenis medan masa tersuai:
<code class="go">type Test struct { Time MyTime `json:"time"` }</code>
Struktur ini kemudiannya boleh dinyahmarshal daripada format JSON dengan zon waktu yang salah atau betul diimbangi.
Atas ialah kandungan terperinci Bagaimana untuk Unmarshal JSON dengan Offset Zon Waktu yang Salah dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!