Как картографическая структура может использовать дискриминатор для декодирования конкретного типа - PullRequest
0 голосов
/ 14 января 2019

В документах (https://github.com/mitchellh/mapstructure) упоминаются преимущества картографической структуры для декодирования

{
  "type": "person",
  "name": "Mitchell"
}

Я ищу пример, показывающий процесс декодирования, например, демаршировать класс Person или Pet

1 Ответ

0 голосов
/ 14 января 2019

Эта библиотека только отображает карты в структуры. Это не делает специфичное для типа декодирование. Цитирую из своего документа:

Возможно, мы не сможем заполнить конкретную структуру без предварительного чтения поля типа из 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...