2 回答

TA貢獻2016條經(jīng)驗 獲得超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
}
首先,解組到內(nèi)部結(jié)構(gòu)中,檢查版本,如果它是舊的,則獲取舊值。
游樂場:https : //play.golang.org/p/AaULW6vJz_。

TA貢獻2019條經(jīng)驗 獲得超9個贊
我會選擇不在這里使用 3 個不同的結(jié)構(gòu),因為它們實際上都是一樣的。
按原樣修改結(jié)構(gòu) MyStruct 并按原樣將其加載json:"value"到新變量中,如果 Value 不存在,則 Unmarshal 的一部分應將值復制到 Value 變量中。
但是,我會在這里支持 Kostix 的推薦。加載和保存數(shù)據(jù)的 API 或進程應嘗試通過建議的機制考慮版本控制。將 av# 添加到您的 URI 中,或者如果您要將項目保存到磁盤,則可能將其與版本號一起保存,然后處理與正確版本相對應的每個結(jié)構(gòu)的內(nèi)部部分:
{
"version": 1,
"struct": { ... }
}
- 2 回答
- 0 關注
- 270 瀏覽
添加回答
舉報