如何解决如何在Go中为标量派生的类型实现UnmarshalJSON?
将指针接收器用于解组方法。如果使用值接收器,则方法返回时,对接收器的更改将丢失。
unmarshal方法的参数是JSON文本。解组JSON文本以获取纯字符串,并删除所有JSON引号。
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
}
JSON标记与示例JSON之间不匹配。我更改了JSON以匹配标记,但是您可以使用其他方法进行更改。
if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
[playground example](http://play.golang.org/p/-kOYet4CdH)
解决方法
我有一个简单的类型,可以在Go中实现子类型整数const到字符串的转换,反之亦然。我希望能够自动将JSON中的字符串解组为这种类型的值。我不能,因为UnmarshalJSON没有给我一种返回或修改标量值的方法。期望有一个结构,其成员由UnmarshalJSON设置。除内置标量类型外,“,string”方法不适用于其他类型。有没有一种方法可以为派生的标量类型正确实现UnmarshalJSON?
这是我所追求的例子。我希望它打印“ Hello Ralph”四次,但是它却打印“ Hello Bob”四次,因为PersonID未被更改。
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 {
// The following line is not correct
intValue = Lookup(string(data))
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())
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。