在Json中使用[] struct

时间:2015-01-08 17:09:14

标签: json struct go

我试图将JSON解析为[]结构,从https://api.github.com/events检索JSON 但是,当我尝试访问数组中的每个结构时,我收到一个错误:

type GITHUB_EVENT does not support indexing

我如何访问数组中的每个结构?

func httpGetEvents() {
    eventDataRAW := httpPageGet("https://api.github.com/events", true)
    eventDataJSON := new(GITHUB_EVENT)

    _ = json.Unmarshal([]byte(eventDataRAW), &eventDataJSON)

    fmt.Println(eventDataJSON[0].Id)
}

//--------------------------------------------------------------------------------------//

type GITHUB_EVENT []struct {
    Id    string `json:"id"`
    Type  string `json:"type"`
    Actor struct {
        Id         int    `json:"id"`
        Login      string `json:"login"`
        GravatarId string `json:"gravatar_id"`
        Url        string `json:"url"`
        AvatarUrl  string `json:"avatar_url"`
    } `json:"actor"`
    Repo struct {
        Id   int    `json:"id"`
        Name string `json:"name"`
        Url  string `json:"url"`
    } `json:"repo"`
    Payload struct {
        PushId       int    `json:"push_id"`
        Size         int    `json:"size"`
        DistinctSize int    `json:"distinct_size"`
        Ref          string `json:"ref"`
        Head         string `json:"head"`
        Before       string `json:"before"`
        Commits      []struct {
            Sha    string `json:"sha"`
            Author struct {
                Email string `json:"email"`
                Name  string `json:"name"`
            } `json:"author"`
            Message  string `json:"message"`
            Distinct bool   `json:"distinct"`
            Url      string `json:"url"`
        } `json:"commits"`
    } `json:"payload"`
    Public    bool   `json:"public"`
    CreatedAt string `json:"created_at"`
}

1 个答案:

答案 0 :(得分:1)

本声明:

eventDataJSON := new(GITHUB_EVENT)

eventDataJSON声明为*GITHUB_EVENT(指向切片的指针),并将其初始化为nil指针。在解组之后,您可以通过在索引之前显式地解析指针来访问第一个事件:

(*eventDataJSON)[0].Id

然而,更常规的方法是使用make

eventDataJSON := make(GITHUB_EVENT, 0)

eventDataJSON声明为GITHUB_EVENT,并将其初始化为空切片。 (请记住,make适用于特殊的内置类型,例如切片,地图和通道)。

您可以将指向此切片的指针传递给json.Unmarshal

_ = json.Unmarshal([]byte(eventDataRAW), &eventDataJSON)

...然后直接索引切片:

fmt.Println(eventDataJSON[0].Id)

此外,json.Marshal将负责分配输出值,因此您可以声明eventDataJSON并跳过任何显式初始化:

var eventDataJSON GITHUB_EVENT

示例:http://play.golang.org/p/zaELDgnpB2