将JSON字符串解组为常量

Fri*_*oße 7 json go unmarshalling

在我的Go代码中,我有以下情况:

type Operator int
const (
    UNKNOWN  Operator = iota
    EQUALS
    CONTAINS
    BETWEEN
    DISTANCE
)

type Filter struct {
    Field string      `json:"field"`
    Operator Operator `json:"operator"`
    Values []string   `json:"values"`
}
Run Code Online (Sandbox Code Playgroud)

我期望的JSON看起来如下:

{
    "operator": "EQUALS",
    "field": "name",
    "values": [ "John", "Doe" ]
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个映射,以便json.Unmarshal在Filter结构中设置正确的运算符常量吗?我知道Unmarshaler接口,但我认为这不能真正用于常量值.

我真的希望将常量保留在我的代码中,因为当我传递它时,这很好地强制执行类型检查和一致性.

lnm*_*nmx 7

encoding/json Unmarshaler界面将与工作Operator类型,但它必须有一个指针作为它的接收器:

func (o *Operator) UnmarshalJSON(b []byte) error {
    str := strings.Trim(string(b), `"`)

    switch {
        case str == "CONTAINS":
            *o = CONTAINS

        default:
            *o = UNKNOWN
            // or return an error...
    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

JSON解码器将从结构中获取Operator字段的地址FilterUnmarshalJSON在其上调用方法.

请注意,您可以encoding/TextUnmarshaler通过更改UnmarshalJSONUnmarshalText上面来实现更通用的.

这是一个游乐场的例子:http://play.golang.org/p/szcnC6L86u

可以说,对于运算符使用字符串基类型可能更简单:http://play.golang.org/p/FCCg1NOeYw