Разбор строки для перечисления из JSON в Голанге - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть перечисление, определенное как

type MyEnum int

const(
   FirstEnum MyEnum = iota
)

Затем у меня есть json, у которого есть пара ключ-значение "Key": "FirstEnum".Я деинсталлирую вот так.

var data map[string]interface{}
err := json.Unmarshal([]byte(json), &data)
x := data["key"].(MyEnum)

Когда я запускаю это, я получаю ошибку:

panic: interface conversion: interface {} is string, not ps.Protocol [recovered]
        panic: interface conversion: interface {} is string, not ps.Protocol

Есть ли способ заставить это работать как обычное преобразованиестрокового представления перечисления в тип перечисления в Go?

1 Ответ

0 голосов
/ 01 декабря 2018

Я понял что-то, что работает аналогичным образом (по крайней мере, работает в моей текущей ситуации):

Используйте string для enum -подобных констант:

type MyEnum string

const(
   FirstEnum MyEnum = "FirstEnum"
)

Теперь используйте декодирование json для пользовательских типов, как указано здесь .

data := MyJsonStruct{}
err := json.Unmarshal([]byte(json), &data)

MyJsonStruct будет выглядеть примерно так:

type MyJsonStruct struct {
    Key MyEnum
}

Затем вы можете сделать MyJsonStructреализовать интерфейс Unmarshaler, чтобы вы могли проверять заданные значения.

func (s *MyJsonStruct) UnmarshalJSON(data []byte) error {
    // Define a secondary type so that we don't end up with a recursive call to json.Unmarshal
    type Aux MyJsonStruct;
    var a *Aux = (*Aux)(s);
    err := json.Unmarshal(data, &a)
    if err != nil {
        return err
    }

    // Validate the valid enum values
    switch s.Key {
    case FirstEnum, SecondEnum:
        return nil
    default:
        s.Key = ""
        return errors.New("invalid value for Key")
    }
}

Playground

...