重命名的 JSON 字段

我们希望一个JSON场重命名value,以v生产。在我们所有的用户都使用新的结构之前,我们将继续将旧的 JSON 结构加入我们的代码中。所以我们也想处理这个问题。


如果你注意到,First是原来的结构,Second是新的结构。为了处理这两种结构,我创建了一个MyStruct并基于version,我将其复制OldValue到Value


if m.Version <= 1 {

    m.Value = m.OldValue

}

有没有更好的方法来处理这个问题,而不是我的代码。

package main


import "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)


}



慕斯709654
浏览 227回答 2
2回答

慕沐林林

您实际上可以通过一个解组来完成它,尽管您需要另一种类型:type Second struct {&nbsp; &nbsp; Version int `json:"version"`&nbsp; &nbsp; Value&nbsp; &nbsp;int `json:"v"`}type SecondWithOldValue struct {&nbsp; &nbsp; OldValue int `json:"value"`&nbsp; &nbsp; Second}type MyStruct SecondWithOldValuefunc (v *MyStruct) UnmarshalJSON(b []byte) error {&nbsp; &nbsp; if err := json.Unmarshal(b, (*SecondWithOldValue)(v)); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; if v.Version <= 1 {&nbsp; &nbsp; &nbsp; &nbsp; v.Value = v.OldValue&nbsp; &nbsp; }&nbsp; &nbsp; return nil}游乐场:https : //play.golang.org/p/yII-ncxnU4。下面的旧答案。如果你对双重解组没问题,你可以这样做:type Second struct {&nbsp; &nbsp; Version int `json:"version"`&nbsp; &nbsp; Value&nbsp; &nbsp;int `json:"v"`}type MyStruct struct {&nbsp; &nbsp; Second}func (v *MyStruct) UnmarshalJSON(b []byte) error {&nbsp; &nbsp; if err := json.Unmarshal(b, &v.Second); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; if v.Version <= 1 {&nbsp; &nbsp; &nbsp; &nbsp; var oldV struct{ Value int }&nbsp; &nbsp; &nbsp; &nbsp; if err := json.Unmarshal(b, &oldV); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; v.Value = oldV.Value&nbsp; &nbsp; }&nbsp; &nbsp; return nil}首先,解组到内部结构中,检查版本,如果它是旧的,则获取旧值。游乐场:https : //play.golang.org/p/AaULW6vJz_。

慕少森

我会选择不在这里使用 3 个不同的结构,因为它们实际上都是一样的。按原样修改结构 MyStruct 并按原样将其加载json:"value"到新变量中,如果 Value 不存在,则 Unmarshal 的一部分应将值复制到 Value 变量中。但是,我会在这里支持 Kostix 的推荐。加载和保存数据的 API 或进程应尝试通过建议的机制考虑版本控制。将 av# 添加到您的 URI 中,或者如果您要将项目保存到磁盘,则可能将其与版本号一起保存,然后处理与正确版本相对应的每个结构的内部部分:{&nbsp; &nbsp; "version": 1,&nbsp; &nbsp; "struct": { ... }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go