2 回答
TA贡献2016条经验 获得超9个赞
您实际上可以通过一个解组来完成它,尽管您需要另一种类型:
type Second struct {
Version int `json:"version"`
Value int `json:"v"`
}
type SecondWithOldValue struct {
OldValue int `json:"value"`
Second
}
type MyStruct SecondWithOldValue
func (v *MyStruct) UnmarshalJSON(b []byte) error {
if err := json.Unmarshal(b, (*SecondWithOldValue)(v)); err != nil {
return err
}
if v.Version <= 1 {
v.Value = v.OldValue
}
return nil
}
游乐场:https : //play.golang.org/p/yII-ncxnU4。
下面的旧答案。
如果你对双重解组没问题,你可以这样做:
type Second struct {
Version int `json:"version"`
Value int `json:"v"`
}
type MyStruct struct {
Second
}
func (v *MyStruct) UnmarshalJSON(b []byte) error {
if err := json.Unmarshal(b, &v.Second); err != nil {
return err
}
if v.Version <= 1 {
var oldV struct{ Value int }
if err := json.Unmarshal(b, &oldV); err != nil {
return err
}
v.Value = oldV.Value
}
return nil
}
首先,解组到内部结构中,检查版本,如果它是旧的,则获取旧值。
游乐场:https : //play.golang.org/p/AaULW6vJz_。
TA贡献2019条经验 获得超9个赞
我会选择不在这里使用 3 个不同的结构,因为它们实际上都是一样的。
按原样修改结构 MyStruct 并按原样将其加载json:"value"到新变量中,如果 Value 不存在,则 Unmarshal 的一部分应将值复制到 Value 变量中。
但是,我会在这里支持 Kostix 的推荐。加载和保存数据的 API 或进程应尝试通过建议的机制考虑版本控制。将 av# 添加到您的 URI 中,或者如果您要将项目保存到磁盘,则可能将其与版本号一起保存,然后处理与正确版本相对应的每个结构的内部部分:
{
"version": 1,
"struct": { ... }
}
- 2 回答
- 0 关注
- 226 浏览
添加回答
举报