在 golang 中解组 json 数组

Unmarshalling a json array in golang

我有一个关于 golang 解组的问题。我试图解组 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-

这不会奏效。 json 中的内容是一个 PublicKey 类型的数组。 KeysResponse 类型将用于 json 看起来像这样;

{
   "Collection": [{"id": 1,"key": "-"},{"id": 2,"key": "-"},{"id": 3,"key": "-"}]
}

这不是你拥有的。如果您希望数据以该类型存储,我建议如下; response := KeysResponse{keys} 在你解编成 keys 之后的线上。

详细说明这种区别。在工作案例中,json 只是一个包含对象的数组。我上面写的 json 是一个对象,它有一个名为 Collection 的单个 属性 ,它是数组类型,数组中的对象由 PublicKey 类型表示(对象带有一个名为 id 的 int 和一个名为 key 的字符串)。在编写解组 json 的代码时,使用像这样的简单英语来描述结构很有帮助,它会准确地告诉您 Go 中需要什么 types/structures 来保存数据。