Go 如何将json解组到[]个人?
我正在尝试动态设置接口{}类型的字段。在下面的所有情况下,json解组到正确的结构中,但在“问题”情况下,json解组到[]接口{}。在这种情况下,我期待着[]人。为什么“问题”的类型不对Go 如何将json解组到[]个人?,go,Go,我正在尝试动态设置接口{}类型的字段。在下面的所有情况下,json解组到正确的结构中,但在“问题”情况下,json解组到[]接口{}。在这种情况下,我期待着[]人。为什么“问题”的类型不对 您当前的问题与JSON解组完全无关 您将项定义为类型接口{},因此显然,当您检查它时,它将是类型接口{}。如果希望其类型为[]Person,只需将其定义为: type Employees struct { Indicator string `json:"indicator"` Items
您当前的问题与JSON解组完全无关 您将
项
定义为类型接口{}
,因此显然,当您检查它时,它将是类型接口{}
。如果希望其类型为[]Person
,只需将其定义为:
type Employees struct {
Indicator string `json:"indicator"`
Items []Person `json:"items"`
}
一旦您完成了,您的测试用例将产生预期的结果。但是您的
项
仍将为空,因为您的输入JSON没有项
字段。问题在于接口的基础值不是指针:
e.Items = []Person{}
确实,您正在向接口本身传递指针:
json.Unmarshal(k, &e.Items)
这并不能解决基础值是非指针的问题
var a interface{} = &T{}
var b interface{} = T{}
b = &b
a
和b
的类型不同,解组器将以不同的方式处理,在b
的情况下,解组器将选择用map[string]接口{}
替换指向的值
因此,要解决眼前的问题,您可以执行以下操作:
if e.Indicator == "more difficult" {
k = j
e.Items = &Person{}
} else {
e.Items = &[]Person{}
}
return json.Unmarshal(k, e.Items)
json.Unmarshal(k,&e.Items)
您正在传递一个指向接口的指针,即*接口{}
,您不应该这样做,您应该传递一个指向具体类型的指针,例如*[]Person
。。。。因为Go是静态类型。你解组到接口{},你得到接口{}。@mkopriva你能作为答案发布吗?坦斯克!重新定义它不是一种选择,你试图做的是不可能的。
if e.Indicator == "more difficult" {
k = j
e.Items = &Person{}
} else {
e.Items = &[]Person{}
}
return json.Unmarshal(k, e.Items)