Эта библиотека только отображает карты в структуры. Это не делает специфичное для типа декодирование. Цитирую из своего документа:
Возможно, мы не сможем заполнить конкретную структуру без предварительного чтения поля типа из JSON. Мы всегда могли сделать два прохода для декодирования JSON (сначала читая «type», а остальные позже). Тем не менее, гораздо проще просто декодировать это в map[string]interface{}
структуру, прочитать ключ «type», а затем использовать что-то вроде этой библиотеки для декодирования его в правильную структуру.
Все, что он предлагает, это то, что вам нужно только один раз проанализировать источник JSON на карте, и тогда вы сами сможете решить, какой тип вам нужно отобразить или распаковать. Затем вы можете использовать уже построенную карту, чтобы заполнить нужный вам тип.
См. Этот пример:
type Person struct {
Name string `json:"name"`
}
type Credentials struct {
User string `json:"user"`
Password string `json:"password"`
}
func main() {
for _, src := range []string{srcPerson, srcCredentials} {
var m map[string]interface{}
if err := json.Unmarshal([]byte(src), &m); err != nil {
panic(err)
}
switch m["type"] {
case "person":
var p Person
if err := mapstructure.Decode(m, &p); err != nil {
panic(err)
}
fmt.Printf("%T %+v\n", p, p)
case "credentials":
var c Credentials
if err := mapstructure.Decode(m, &c); err != nil {
panic(err)
}
fmt.Printf("%T %+v\n", c, c)
}
}
}
const srcPerson = `{
"type": "person",
"name": "Mitchell"
}`
const srcCredentials = `{
"type": "credentials",
"user": "bob",
"password": "secret"
}`
Выход:
main.Person {Name:Mitchell}
main.Credentials {User:bob Password:secret}