在golang中解组json数组

时间:2015-12-01 23:24:19

标签: json encoding go unmarshalling

我有一个关于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)

}

http://play.golang.org/p/L9xDG26M8-

1 个答案:

答案 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中保存数据所需的类型/结构。