Я понял что-то, что работает аналогичным образом (по крайней мере, работает в моей текущей ситуации):
Используйте 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