一尘不染

解组json以反映结构

go

是否可以在不对原始类型进行硬编码的情况下将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在此示例中,我使用了强制转换。但是,如果我不知道类型怎么办?

当我仅v用于解组时,该结构将被清零。

json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v)

当我省略演员表时,我会得到一张地图。这是可以理解的

json.Unmarshal([]byte("{\"firstname\": \"bender\"}"), v.Elem().Interface())

阅读 169

收藏
2020-07-02

共1个答案

一尘不染

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

new := v.Elem().Interface()

new推断有interface{}型。

然后,当您将地址解组时,类型&new*interface{}(指向interface {}的指针),并且解组无法按预期工作。

如果可以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

2020-07-02