我希望下面的代码打印一个类型为 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/