是否可以在不对原始类型进行硬编码的情况下将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) }
Employee在此示例中,我使用了强制转换。但是,如果我不知道类型怎么办?
Employee
当我仅v用于解组时,该结构将被清零。
v
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v)
当我省略演员表时,我会得到一张地图。这是可以理解的
json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v.Elem().Interface())
这里的问题是,如果您在此处省略类型断言:
new := v.Elem().Interface()
该new推断有interface{}型。
new
interface{}
然后,当您将地址解组时,类型&new为*interface{}(指向interface {}的指针),并且解组无法按预期工作。
&new
*interface{}
如果可以Elem()直接使用指针引用而不是直接使用类型断言,则可以避免类型断言。
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) }
游乐场:https : //play.golang.org/p/lTBU-1PqM4