从JSON反序列化时,接口断言失败

问题描述

在序列化/反序列化带有JSON的结构时,我可能做错了。在JSON反序列化后声明接口时:

AData2 = anInterface.(Data)

在运行时,go需要一个map [string]接口,但是该对象的类型为Data:

type Data struct {
    Content string
    Links   []string
}

它引发错误

panic:接口转换:interface {}是map [string] interface {}, 不是main.Data

位于https://play.golang.org/p/jm3_ut3R56n的完整代码

在此先感谢您的提示

解决方法

您不能只是将任何interface声明为随机struct类型或类似内容。

如果该interface实际上是该struct类型的数据,则只有您可以断言该interface类型的数据为struct


type Data struct {
    Content string
    Links   []string
}

func main() {
    var AData,AData2 Data
    var anInterface interface{}

    // populate data
    AData.Content = "hello world"
    AData.Links = []string{"link1","link2","link3"}
    anInterface = AData
    AData2 = anInterface.(Data)
}

您看到anInterface已经是Data类型的值,这就是为什么我们可以再次将其声明为Data类型。

另一件事,如果您实际上想将json数据反序列化为Data类型的结构,则应该直接unmarshal到该变量中。

var AData2 Data

err = json.Unmarshal([]byte(value),&AData2)
if err != nil {
    panic(err)
}