我們要在生產領域的JSON命名value
到v
。直到我們所有的用戶使用新的結構體,我們將繼續將舊的JSON結構體放入我們的代碼中。所以我們也想要處理這個。更名爲JSON場
如果你注意到,First
是原來的結構,Second
是新的結構。爲了處理這兩種結構,我創建了一個MyStruct
和基於version
,我複製到OldValue
Value
有沒有更好的方式來處理這個問題,而不是我的代碼。
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)
}
Marshaler接口(https://golang.org/pkg/encoding/json/#Marshaler)用於你的結構,你可以按你認爲合適的方式編組''v'或'value'。 – elithrar
如果你使用的是REST,你應該在你的REST URL中編碼版本,而不是在你周圍的數據中編碼。也就是說,所有包含'/ v1 /'作爲其路徑部分組件的API URL都必須返回並使用根據「v1」規則格式化的JSON。如果您需要更改數據格式,請介紹「v2」,提供實施新規則的新API端點並逐步過渡您的客戶端。轉換之後,「v1」端點變得過時並且可以安全地移除。 – kostix
謝謝。在這裏,我們沒有使用REST API。在這種情況下,我們使用JavaScript腳本自動收集來自不同客戶端的數據。從技術上講,我們也可以在這裏引入REST方法,但我們現在沒有這樣做。我們將在未來考慮它。謝謝你的提示。 – Sundar