[英]JSON decoding in Go changes the object type?
我正在尝试构建一个库,该库可以从JSON文件中读取多种不同类型的对象(实际的库会将它们从长沙发中拉出,但出于此目的,它是从JSON加载它们的)。
我的库对正在加载的对象的具体类型一无所知,因此下面的“ CreateObject()”调用(由实际代码中的接口来满足)。
我遇到一个问题,当我尝试将由CreateObject()创建的对象强制转换回我的具体类型(在示例中为MyType)时,我会感到恐慌:
panic: interface conversion: interface is map[string]interface {}, not main.MyType
我想知道我在哪里出问题了,或者我是否还有另一种类似的方式来解决这个问题。 如果我使用Java进行操作,则将使用泛型,并且希望它很简单。
请注意,如果我注释掉json.NewDecoder ...行,那么代码将起作用(按预期方式打印出空白行)。 这意味着在解码操作中发生了一些事情。
可运行的示例如下:
package main
import (
"encoding/json"
"fmt"
"strings"
)
type MyType struct {
Name string `json:"name"`
Age int32 `json:"age"`
}
func CreateObject() interface{} {
return MyType{}
}
func LoadJsonData() interface{} {
obj := CreateObject()
jsonStr := `{"name":"Person", "age":30}`
json.NewDecoder(strings.NewReader(jsonStr)).Decode(&obj)
return obj
}
func main() {
obj := LoadJsonData()
// This works for some reason
// y := obj.(map[string]interface{})
// fmt.Println(y["name"])
// This causes a panic
x := obj.(MyType)
fmt.Println(x.Name)
}
您应该使用指针而不是struct:
func CreateObject() interface{} {
return &MyType{} // here
}
...
// This causes a panic
x := obj.(*MyType) // and there
fmt.Println(x.Name)
欣赏: http : //play.golang.org/p/vJjaQlq_vh
如果您想了解更多信息,请考虑以下线程: golang无法为反射创建的对象解析json
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.