Go 如何将json解组到[]个人?

Go 如何将json解组到[]个人?,go,Go,我正在尝试动态设置接口{}类型的字段。在下面的所有情况下,json解组到正确的结构中,但在“问题”情况下,json解组到[]接口{}。在这种情况下,我期待着[]人。为什么“问题”的类型不对 您当前的问题与JSON解组完全无关 您将项定义为类型接口{},因此显然,当您检查它时,它将是类型接口{}。如果希望其类型为[]Person,只需将其定义为: type Employees struct { Indicator string `json:"indicator"` Items

我正在尝试动态设置接口{}类型的字段。在下面的所有情况下,json解组到正确的结构中,但在“问题”情况下,json解组到[]接口{}。在这种情况下,我期待着[]人。为什么“问题”的类型不对


您当前的问题与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)