当前位置: 首页 > 面试题库 >

解组json以反映结构

姜经武
2023-03-14
问题内容

是否可以在不对原始类型进行硬编码的情况下将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())

问题答案:

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

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



 类似资料:
  • 问题内容: http://play.golang.org/p/f6ilWnWTjm 我正在尝试解码以下字符串,但仅获取空值。 如何在Go中解码嵌套的JSON结构? 我想将以下内容转换为地图数据结构。 问题答案: 在Go中使用嵌套结构来匹配JSON中的嵌套结构。 这是一个如何处理示例JSON的示例: 游乐场链接 您还可以对内部结构使用匿名类型: 游乐场链接 或外部和内部结构: 游乐场链接 如果您不知

  • 问题内容: 我想解组结构定义为: 使用似乎只对使用的,而忽略了场:https://play.golang.org/p/WUBfzpheMl 我有一个笨拙的解决方案,我可以手动设置该字段,但是我想知道是否有人可以使用一种更清洁或更简单的方法来进行设置。 谢谢! 问题答案: 发生这种情况是因为嵌入在中。这意味着当json库调用unmarshaler时,它最终以on调用了。 因此,在内部,参数包含整个j

  • 我关注了 json 根据给出的答案,我尝试了以下 我得到一个空数组,有如下错误。有什么建议吗? json:无法将数组解组为map[string]*json.RawMessage类型的Go值

  • 问题内容: 我想将以下JSON解组到结构中: 我试图以各种方式修改,但是结构始终为空: 输出: 过去使用的JSON没有括号,因此我怀疑问题与它们有关。 有人可以帮忙吗? https://play.golang.org/p/pymKbOqcM- 问题答案: 发生这种情况是因为其他包()无法访问私有字段(即使具有反射)。在私有语言中,私有字段是以小写字母开头的字段。要解决此问题,请使您的结构包含公共字

  • 问题内容: 我想在Go中解组以下JSON数据: 我知道该怎么做,我这样定义一个结构: 我不知道的是,是否有一种简单的方法可以对此进行专门化处理。我想在拆封后以如下格式获取数据: 这样我可以在像这样解组后稍后使用它: 我真的不知道如何在GO中轻松或习惯地执行此操作,因此我希望有一个不错的解决方案。 问题答案: 您可以通过在结构上实现接口来实现。这样的事情应该做: 这基本上表示应该从2个元素的floa