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

时间:2015-08-19 13:02:39

标签: json go

我正在尝试构建一个可以从JSON文件中读取多个不同类型对象的库(实际库将它们从couchdb中拉出来,但出于此目的,它将从json中加载它们。)

我的库对加载的具体对象类型一无所知,因此下面的“CreateObject()”调用(实际代码中的接口满足)。

我遇到的问题是,当我尝试将CreateObject()调用创建的对象强制转换回我的具体类型(示例中的MyType)时,我感到恐慌:

panic: interface conversion: interface is map[string]interface {}, not main.MyType

我想知道我在哪里出错,或者是否还有另外一种类似的方式我应该接近这个问题。如果我在Java中这样做,我会使用泛型,并期望它是直截了当的。

请注意,如果我注释掉json.NewDecoder ...行,那么代码就可以工作(按预期打印出一个空白行)。这意味着在解码操作中发生了一些事情。

Runnable示例如下:

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)
}

Playground

1 个答案:

答案 0 :(得分:3)

您应该使用指针而不是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 fails to parse json for reflection created object