如何在Go中为标量派生的类型实现UnmarshalJSON?

我有一个简单的类型,可以在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())

}

}

}

回答:

将指针接收器用于解组方法。如果使用值接收器,则方法返回时,对接收器的更改将丢失。

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中为标量派生的类型实现UnmarshalJSON? 的全部内容, 来源链接: utcz.com/qa/427180.html

回到顶部