2015-01-08 2 views
-1

Я пытаюсь разобрать JSON к [] структуре, то JSON извлекаются из https://api.github.com/events Однако, когда я пытаюсь получить доступ к каждой-структуре в пределах массива я получаю сообщение об ошибке:Использование [] STRUCT с 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

Это заявление:

eventDataJSON := new(GITHUB_EVENT) 

объявляет eventDataJSON как *GITHUB_EVENT (указатель на срез), и инициализирует его как нулевой указатель. После демаршалинга, вы можете получить доступ к первому событию, явно deref инга указатель перед индексированием:

(*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

Смежные вопросы