非RFC 3339 時間格式的自訂JSON 解組
Go 中的encoding/json 包嚴格遵守RFC 3339 時間格式,當反序列化JSON 資料。在處理偏離此標準的時間格式時,這可能會很不方便。
解決方案:實作自訂編組器和解組器
而不是修改現有的JSON 資料或依賴中間轉換步驟,更合適的解決方案是在自訂上實作json.Marshaler 和json.Unmarshaler 介面
以下範例示範如何建立處理特定非RFC 3339時間格式的反序列化的自訂類型(CustomTime):
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()) } }
注意: CustomTime.IsSet() 方法檢查時間欄位是否不為零,提供了一種方法來確定時間值是否已實際設定或不是。
透過實作自訂編組器和解組器,您可以靈活地處理可能偏離 RFC 3339 標準的時間格式,從而在 Go 中實現無縫的 JSON 資料反序列化。
以上是在 Go 中解組 JSON 時如何處理非 RFC 3339 時間格式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!