2015-08-19 58 views
2

我想構建一個庫,可以從JSON文件中讀取多個不同類型的對象(實際庫將它們從couchdb中拉出來,但爲了這個目的,它將從json中加載它們)。Go中的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

回答