如果在解组JSON时出错,Go的json.Unmarshal
将返回一个部分修改的结构。有没有办法确保对象在发生错误时保持完整?
例如,在以下代码中(Go Playground(:
type myStruct struct {
Name string
Age int
}
func main() {
me := &myStruct{
Name: "Alex",
Age: 38,
}
data := []byte(`{"Name":"Bob", "Age": true}`)
err := json.Unmarshal(data, me)
fmt.Println(err)
fmt.Println(me)
}
将me
结构更改为{Bob 38}
,而我希望它保持为{ALex 38}
。有可能这样做吗?
使用反射,您可以挖掘指针以生成底层结构的新值,并将其传递给json。如果可以进行解组,则替换指向新解码结构的原始指针的值。
package main
import (
"encoding/json"
"fmt"
"reflect"
)
type myStruct struct {
Name string
Age int
}
func main() {
me := &myStruct{
Name: "Alex",
Age: 38,
}
data := []byte(`{"Name":"Bob", "Age": true}`)
err := unmarshal(data, me)
fmt.Println(err)
fmt.Println(me)
}
func unmarshal(data []byte, dst interface{}) error {
typ := reflect.ValueOf(dst).Elem().Type()
tmp := reflect.New(typ)
err := json.Unmarshal(data, tmp.Interface())
if err == nil {
reflect.ValueOf(dst).Elem().Set(tmp.Elem())
}
return err
}
输出:
json: cannot unmarshal bool into Go struct field myStruct.Age of type int
&{Alex 38}
https://play.golang.org/p/HjTEzTfdchx
https://play.golang.org/p/aia-LHIOB2R