解组json以反映结构

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)

eug*_*ioy 7

这里的问题是,如果你在这里省略类型断言:

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