我试图将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"`
}
答案 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