从Golang中的JSON解析字符串以枚举

时间:2018-12-01 09:49:05

标签: json go enums unmarshalling

我的枚举定义为

type MyEnum int

const(
   FirstEnum MyEnum = iota
)

然后,我有一个具有键值对"Key": "FirstEnum"的json。我正在这样解组。

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 :(得分:1)

我想出了一些类似的方式(至少适用于我目前的情况):

string用于类似enum的常量:

type MyEnum string

const(
   FirstEnum MyEnum = "FirstEnum"
)

现在,使用解码json自定义类型,如here所述。

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