Penyingkiran JSON Tersuai untuk Format Masa Bukan RFC 3339
Pakej pengekodan/json dalam Go mematuhi format masa RFC 3339 dengan ketat apabila menyahsiri data JSON. Ini boleh menyusahkan apabila berurusan dengan format masa yang menyimpang daripada standard ini.
Penyelesaian: Melaksanakan Custom Marshalers and Unmarshalers
Daripada mengubah suai data JSON sedia ada atau bergantung pada langkah penukaran perantaraan, penyelesaian yang lebih sesuai adalah dengan melaksanakan antara muka json.Marshaler dan json.Unmarshaler pada jenis tersuai.
Contoh berikut menunjukkan cara mencipta jenis tersuai (CustomTime) yang mengendalikan penyahserikatan format masa bukan RFC 3339 tertentu:
import ( "fmt" "strconv" "strings" "time" "github.com/golang/protobuf/ptypes/timestamp" ) 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() } type Args struct { Time CustomTime } var data = ` {"Time": "2014/08/01|11:27:18"} ` func main() { a := Args{} if err := json.Unmarshal([]byte(data), &a); err != nil { fmt.Println("Error unmarshaling: ", err) return } if !a.Time.IsSet() { fmt.Println("Time not set") } else { fmt.Println(a.Time.String()) } }
Nota : Kaedah CustomTime.IsSet() menyemak sama ada medan Masa bukan sifar, menyediakan cara untuk menentukan sama ada nilai masa sebenarnya ditetapkan atau tidak.
Dengan melaksanakan Marshalers dan Unmarshalers tersuai, anda memperoleh fleksibiliti untuk mengendalikan format masa yang mungkin menyimpang daripada standard RFC 3339, membolehkan penyahserikatan data JSON yang lancar dalam Go.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Format Masa Bukan RFC 3339 Apabila Menyahmarshaling JSON dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!