Не, как раз можно по-другому и нужно. Я не знаю VK API, но слышал много жалоб, что иногда полем может быть строка, иногда структура и т.д. Решается примерно так. Например, в поле может прийти или имя человека или список имён людей:
type personList struct {
names []string
}
func (pl *personList) UnmarshalJSON(data []byte) error {
switch {
case len(data) == 0:
return errors.New("empty JSON chunk")
case data[0] == '"':
var name string
if err := json.Unmarshal(data, &name); err != nil {
return err
}
pl.names = pl.append(names, n)
case data[0] == '[':
return json.Unmarshal(data, &pl.names)
default:
return errors.New("expected string or list")
}
}
Т.е вы определяете тип данных так, как это нужно вашему приложению. А декодер кастомизируете, чтобы он говноджейсон раскладывал так, как вам надо.