我有一个关于golang unmarshalling的问题。我试图解组Json数组,但它在一次解码时给出nil结果,而在另一次解码时成功。我不明白其背后的原因。这是代码中的错误还是预期的错误?
package main
import "fmt"
import "encoding/json"
type PublicKey struct {
Id int
Key string
}
type KeysResponse struct {
Collection []PublicKey
}
func main() {
keysBody := []byte(`[{"id": 1,"key": "-"},{"id": 2,"key": "-"},{"id": 3,"key": "-"}]`)
keys := make([]PublicKey,0)
json.Unmarshal(keysBody, &keys)//This works
fmt.Printf("%#v\n", keys)
response := KeysResponse{}
json.Unmarshal(keysBody, &response)//This doesn't work
fmt.Printf("%#v\n", response)
}
答案 0 :(得分:2)
预计这不起作用。你在json中拥有的是PublicKey
类型的数组。 KeysResponse
类型将用于json,如下所示;
{
"Collection": [{"id": 1,"key": "-"},{"id": 2,"key": "-"},{"id": 3,"key": "-"}]
}
这不是你拥有的。如果您希望将数据存储在该类型中,我建议如下;在您解组到response := KeysResponse{keys}
之后,keys
就行了。
详细说明这种区别。在工作的情况下,json只是一个包含对象的数组。我上面写的json是一个对象,它有一个名为Collection
的属性,它的类型为array,数组中的对象由PublicKey
类型表示(带有一个名为id和字符串的int的对象)叫钥匙)。在处理用于解组json的代码时,使用像这样的简单英语来描述结构是有帮助的,它会准确地告诉您在Go中保存数据所需的类型/结构。