Sle*_*rim 5 reflection json go unmarshalling
是否可以将JSON解组为由反射构成的结构而无需对原始类型进行硬编码?
package main
import (
"fmt"
"encoding/json"
"reflect"
)
type Employee struct {
Firstname string `json:"firstname"`
}
func main() {
//Original struct
orig := new(Employee)
t := reflect.TypeOf(orig)
v := reflect.New(t.Elem())
//Reflected struct
new := v.Elem().Interface().(Employee)
// Unmarshal to reflected struct
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), &new)
fmt.Printf("%+v\n", new)
}
Run Code Online (Sandbox Code Playgroud)
我Employee在这个例子中使用了一个演员.但如果我不知道这种类型怎么办?
当我只是v用于解组时,结构将被归零.
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v)
Run Code Online (Sandbox Code Playgroud)
当我省略演员表时,我会得到一张地图.这是可以理解的
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v.Elem().Interface())
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果你在这里省略类型断言:
new := v.Elem().Interface()
Run Code Online (Sandbox Code Playgroud)
该new推断有interface{}型.
然后当你取消地址解组时,&newis *interface{}(指向接口{}的指针)和unmarshal的类型不能按预期工作.
您可以避免使用类型断言,而不是让Elem()您直接使用指针引用.
func main() {
//Original struct
orig := new(Employee)
t := reflect.TypeOf(orig)
v := reflect.New(t.Elem())
// reflected pointer
newP := v.Interface()
// Unmarshal to reflected struct pointer
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), newP)
fmt.Printf("%+v\n", newP)
}
Run Code Online (Sandbox Code Playgroud)
游乐场:https://play.golang.org/p/lTBU-1PqM4
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |