从 JSON 解析非标准时间格式
将 JSON 数据解码为自定义结构时,可能会出现日期格式不一致的情况。为了解决这个问题,Golang 提供了实现自定义编组和解组函数的选项。
自定义编组器和解组器函数
要指定自定义解析格式,类型别名为为时间字段创建,Marshaler 和 Unmarshaler 接口实现如下:
type JsonBirthDate time.Time // UnmarshalJSON translates a JSON string to a time value. func (j *JsonBirthDate) UnmarshalJSON(b []byte) error { s := strings.Trim(string(b), `"`) t, err := time.Parse("2006-01-02", s) if err != nil { return err } *j = JsonBirthDate(t) return nil } // MarshalJSON converts a time value to a JSON string. func (j JsonBirthDate) MarshalJSON() ([]byte, error) { return json.Marshal(time.Time(j)) }
此自定义逻辑检查 JSON 值是否为所需格式并相应地对其进行解析。
更新了结构和解析
结构体已更新为使用自定义类型,并且解码可以照常进行:
type Person struct { Name string `json:"name"` BirthDate JsonBirthDate `json:"birth_date"` } decoder := json.NewDecoder(req.Body) if err := decoder.Decode(&person); err != nil { log.Println(err) }
其他功能
为了方便起见,可以添加 Format 方法来提供日期的格式化表示:
// Format prints the date using the specified format string. func (j JsonBirthDate) Format(s string) string { t := time.Time(j) return t.Format(s) }
这种自定义编组和解组方法允许灵活地解析 JSON 中的时间值,即使在它们偏离标准格式。
以上是如何在 Golang 中解析 JSON 中的非标准时间格式?的详细内容。更多信息请关注PHP中文网其他相关文章!