第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重命名的 JSON 字段

重命名的 JSON 字段

Go
慕斯709654 2021-11-15 20:36:53
我們希望一個JSON場重命名value,以v生產(chǎn)。在我們所有的用戶都使用新的結(jié)構(gòu)之前,我們將繼續(xù)將舊的 JSON 結(jié)構(gòu)加入我們的代碼中。所以我們也想處理這個問題。如果你注意到,F(xiàn)irst是原來的結(jié)構(gòu),Second是新的結(jié)構(gòu)。為了處理這兩種結(jié)構(gòu),我創(chuàng)建了一個MyStruct并基于version,我將其復制OldValue到Valueif m.Version <= 1 {    m.Value = m.OldValue}有沒有更好的方法來處理這個問題,而不是我的代碼。package mainimport "fmt"import "encoding/json"import "log"type First struct {    Version int `json:"version"`    Value   int `json:"value"`}type Second struct {    Version int `json:"version"`    Value   int `json:"v"`}type MyStruct struct {    Version  int `json:"version"`    OldValue int `json:"value"`    Value    int `json:"v"`}func main() {    oldValue := []byte(`{"version":1, "value":5}`)    newValue := []byte(`{"version":2, "v":7}`)    var m MyStruct    err := json.Unmarshal(newValue, &m)    if err != nil {        log.Fatal(err)    }    fmt.Println("New Struct")    fmt.Println(m.Value)    err = json.Unmarshal(oldValue, &m)    if err != nil {        log.Fatal(err)    }    fmt.Println("Old Struct")    if m.Version <= 1 {        m.Value = m.OldValue    }    fmt.Println(m.Value)}
查看完整描述

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_。


查看完整回答
反對 回復 2021-11-15
?
慕少森

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": { ... }

}


查看完整回答
反對 回復 2021-11-15
  • 2 回答
  • 0 關注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號