为了账号安全,请及时绑定邮箱和手机立即绑定

重命名的 JSON 字段

重命名的 JSON 字段

Go
慕斯709654 2021-11-15 20:36:53
我们希望一个JSON场重命名value,以v生产。在我们所有的用户都使用新的结构之前,我们将继续将旧的 JSON 结构加入我们的代码中。所以我们也想处理这个问题。如果你注意到,First是原来的结构,Second是新的结构。为了处理这两种结构,我创建了一个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条经验 获得超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_。


查看完整回答
反对 回复 2021-11-15
?
慕少森

TA贡献2019条经验 获得超9个赞

我会选择不在这里使用 3 个不同的结构,因为它们实际上都是一样的。


按原样修改结构 MyStruct 并按原样将其加载json:"value"到新变量中,如果 Value 不存在,则 Unmarshal 的一部分应将值复制到 Value 变量中。


但是,我会在这里支持 Kostix 的推荐。加载和保存数据的 API 或进程应尝试通过建议的机制考虑版本控制。将 av# 添加到您的 URI 中,或者如果您要将项目保存到磁盘,则可能将其与版本号一起保存,然后处理与正确版本相对应的每个结构的内部部分:


{

    "version": 1,

    "struct": { ... }

}


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信