2015-08-05 3 views
1

Работа над моим первым проектом Go, и у меня возникли проблемы, связанные с некоторыми сложными структурами данных. На данный момент, я mocking up the response из API, который возвращает объект JSON, содержащий 2 свойства:Обработка JSON API Response

  • columns содержит массив полей в порядке их следует обрабатывать
  • data содержит массив объектов, содержащий свойства перечислены в columns

мне нужно итерация по data массиву/срезу и, в пределах того, итерации по columns массиву/срезу и извлечь текущее свойство из текущего объекта данных. Я неправильно обрабатываю структуру данных. Много проб и ошибок оставило меня со следующим кодом и достаточно разочарованием, чтобы решить, что мне просто нужно задать вопрос.

res, err := http.Get("http://roadmap-proto.robwilkerson.org/demo.json") 
failOnError(err, "Uh oh") 
defer res.Body.Close() 

// Decode and process the JSON response 
// var v map[string]interface{} 
type View struct { 
    Columns []string    `"json:columns"` 
    Data map[string]interface{} `"json:data"` 
} 
v := View{} 
json.NewDecoder(res.Body).Decode(&v) 
log.Printf("[====>] Data: %s", v) 

Выход log.Printf() это:

Data: {[id avatar name email phone address] map[]} 

columns, кажется, читает хорошо, но не данные. В конечном итоге мне нужно зациклиться на этом и записать каждое поле в ячейку Excel, но до сих пор я даже не могу заставить данные «загружать» должным образом.

Любой толчок в правильном направлении был бы очень признателен.

UPDATE

Я случайно пропущено некоторые ключевые данные: В любой вызов к API, количество и названия столбцов могут быть разными. В рамках данного вызова все объекты массива data будут одинаковыми, но каждый вызов может быть очень и очень разным. Я не могу определить статический struct и иметь эту работу.

+0

Если вы данные динамические, используйте карту – slebetman

ответ

0

Я хотел бы использовать два структуры для этого:

type ColData struct { 
    Id  string `json:"id"` 
    Avatar string `json:"avatar"` 
    Name string `json:"name"` 
    Email string `json:"email"` 
    Phone string `json:"phone"` 
    Address string `json:"address"` 
} 

type View struct { 
    Columns []string `json:"columns"` 
    Data []ColData `json:"data"` 
} 

В ответ на Ваше обновление:

type View struct { 
    Columns []string    `"json:columns"` 
    Data map[string]interface{} `"json:data"` 
} 

просто нужно стать

type View struct { 
    Columns []string    `"json:columns"` 
    Data []map[string]interface{} `"json:data"` 
} 

, чтобы получить данные в структуры , Также может быть приятно просто работать с ними как string или json.RawMessage вместо interface{}, но я не знаю, что вы делаете с ним/что вы могли бы выбраться.

+2

О, ну во-первых, вы получите свои данные, если вместо 'Data map [string] interface {} \' "json: data" \ '' you did 'Data [] map [string] interface {} \ '" json: data "\' ', у вас на самом деле есть кусок карт, а не только карта – user3591723

+0

Один из способов использования' [] map [string] string' (все строки значений объектов?), например, @ user3591723, были бы следующими: https://play.golang.org/p/V8JVfDtynC –