json - 解码为接口(interface)类型

标签 json go unmarshalling

我希望下面的代码打印一个类型为 struct J 的对象,但是它打印了一个类型为 map[string]interface{} 的 map 对象。我能感觉到它为什么会这样,但是当我运行 reflect.ValueOf(i).Kind() 时,它返回 Struct,所以它给我的印象是 Unmarshal 方法应该返回类型 J 而不是映射。谁能赐教一下?

type J struct {
    Text string
}

func main() {
    j := J{}
    var i interface{} = j

    js := "{\"Text\": \"lala\"}"


    json.Unmarshal([]byte(js), &i)

    fmt.Printf("%#v", i)

}

最佳答案

您传递给 Unmarshal 的类型不是 *J,您传递的是 *interface{}

json 包反射(reflect)它接收到的指针的类型时,它会看到 interface{},然后它使用包的默认类型来解码进入,哪些是

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

几乎没有理由使用指向接口(interface)的指针。如果您发现自己使用了一个指向接口(interface)的指针,而您确切地不知道为什么,那么这可能是一个错误。如果您想解码为 J,则直接将其传入。如果您需要将其分配给中间接口(interface),请确保使用指向原始值的指针,而不是指向其接口(interface)的指针。

http://play.golang.org/p/uJDFKfSIxN

j := J{}
var i interface{} = &j

js := "{\"Text\": \"lala\"}"

json.Unmarshal([]byte(js), i)

fmt.Printf("%#v", i)

关于json - 解码为接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36089738/

相关文章:

javascript - Vue.js 显示隐藏带有数据列表的多个元素

Python - 将大型 CSV 文件转换为 JSON

php - 如何在 symfony 中返回 json 编码格式错误

arrays - Golang graphql 使用子图迭代 map

go - 类型如何成为 Go 中的函数?

go - 使用反射访问结构中的结构字段

java - JSONObject.toString() 返回 OutOfMemoryError

amazon-web-services - 做 dynamoattribute.UnmarshalMap 时关系总是为零

java - JAXB XML 解码只看到根元素

java - jackson 解码 : store inner xml as string