在我的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"`
}
我期望的JSON如下所示:
{
"operator": "EQUALS",
"field": "name",
"values": [ "John", "Doe" ]
}
是否可以创建一个映射,使json.Unmarshal在Filter结构中设置正确的运算符常量?我知道Unmarshaler界面,但我认为不能真正将其用于恒定值。
我真的很想在我的go代码中保留常量,因为当我传递常量时,这很好地实现了类型检查和一致性。
该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
}
JSON解码器将从结构中获取Operator
字段的地址Filter
并UnmarshalJSON
在其上调用方法。
请注意,您可以实现比较通用的encoding/TextUnmarshaler
,而不是通过改变UnmarshalJSON
到UnmarshalText
上面。
这是一个操场示例:http : //play.golang.org/p/szcnC6L86u
可以说,将字符串基类型用于Operator可能更简单:http : //play.golang.org/p/FCCg1NOeYw
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句