繁体   English   中英

Go中的JSON解码会更改对象类型吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM