Go自定义JSON反序列化:end字段为空时赋值为start值如何实现
问题解答
完全可以通过为Activity结构体实现UnmarshalJSON方法满足需求,不需要额外用map处理,这也是Go语言处理自定义反序列化逻辑的标准惯用方案。
原生time.Time类型的默认反序列化逻辑只支持RFC3339格式的时间字符串,遇到空字符串会直接抛出解析错误,我们通过自定义反序列化方法即可兼容空字符串场景,实现代码如下:
import ( "encoding/json" "time" ) type Activity struct { Start time.Time `json:"start"` End time.Time `json:"end"` } func (a *Activity) UnmarshalJSON(data []byte) error { // 定义结构体别名,避免反序列化时递归调用自身的UnmarshalJSON导致死循环 type ActivityAlias Activity // 构造临时辅助结构体,将End字段替换为string类型兼容空字符串输入 aux := &struct { End string `json:"end"` *ActivityAlias }{ ActivityAlias: (*ActivityAlias)(a), } // 先把数据反序列化到辅助结构体 if err := json.Unmarshal(data, aux); err != nil { return err } // 自定义End字段的赋值逻辑 if aux.End == "" { a.End = a.Start return nil } // 非空场景按标准时间格式解析 endTime, err := time.Parse(time.RFC3339, aux.End) if err != nil { return err } a.End = endTime return nil }
你提到的测试用例JSON用该实现反序列化后,Activity.End会自动和Activity.Start取值保持一致,正常非空的end字段也会按照原有逻辑正常解析。相比用map手动处理字段的方案,自定义反序列化方法不需要手动做类型转换,后续结构体新增字段时改动成本也更低。
内容的提问来源于stack exchange,提问作者John F
相关产品推荐
相关产品推荐

