在JSON解组错误的情况下保持结构的完整性



如果在解组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

最新更新