登录
首页 >  Golang >  Go问答

在 Golang 中将 JSON 中的字符串解析为枚举

来源:stackoverflow

时间:2024-04-12 11:00:33 438浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《在 Golang 中将 JSON 中的字符串解析为枚举》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我有一个枚举定义为

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 中枚举的字符串表示形式到枚举类型的正常转换一样工作?


解决方案


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

使用 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

今天关于《在 Golang 中将 JSON 中的字符串解析为枚举》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>