从 JSON 解析非标准时间格式
将 JSON 数据解码为自定义结构时,可能会出现日期格式不一致的情况。为了解决这个问题,Golang 提供了实现自定义 marshal 和 unmarshal 函数的选项。
自定义 Marshaler 和 Unmarshaler 函数
要指定自定义解析格式,类型别名为为时间字段创建,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 中的时间值,即使它们偏离标准格式也是如此。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3