Go 中派生标量的 UnmarshalJSON 实现
问题:
转换子类型整型常量的自定义类型转换为字符串,反之亦然,需要自动解组 JSON 字符串。这是具有挑战性的,因为 UnmarshalJSON 不提供在不使用结构体的情况下修改标量值的方法。
解决方案:
要为派生标量类型实现 UnmarshalJSON,请考虑以下步骤:
使用指针接收器:
使用 UnmarshalJSON 方法的指针接收器来修改接收器的值。
解组为字符串:
将 JSON 文本解组为字符串纯字符串,删除所有 JSON 引用。
查找和设置值:
使用Lookup函数根据字符串值检索对应的PersonID。将结果分配给接收者。
示例:
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
代码示例:
package main import ( "encoding/json" "fmt" ) type PersonID int const ( Bob PersonID = iota Jane Ralph Nobody = -1 ) var nameMap = map[string]PersonID{ "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nobody": Nobody, } var idMap = map[PersonID]string{ Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nobody: "Nobody", } func (intValue PersonID) Name() string { return idMap[intValue] } func Lookup(name string) PersonID { return nameMap[name] } func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil } type MyType struct { Person PersonID `json: "person"` Count int `json: "count"` Greeting string `json: "greeting"` } func main() { var m MyType if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil { fmt.Println(err) } else { for i := 0; i < m.Count; i++ { fmt.Println(m.Greeting, m.Person.Name()) } } }
输出:
Hello Ralph Hello Ralph Hello Ralph Hello Ralph
以上是如何在 Go 中为派生标量类型实现 UnmarshalJSON?的详细内容。更多信息请关注PHP中文网其他相关文章!