【问题标题】:JSON decoding in Go changes the object type?Go 中的 JSON 解码会改变对象类型?
【发布时间】:2015-08-19 21:44:05
【问题描述】:

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

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

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

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

我想知道我在哪里出错了,或者是否有另一种更类似于 go 的方式来解决这个问题。如果我在 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)
}

Playground

【问题讨论】:

    标签: json go


    【解决方案1】:

    你应该使用指针而不是结构:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-06
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2021-11-09
      • 2015-03-20
      相关资源
      最近更新 更多