Go json Unmarshaller不叫

Go json Unmarshaller不叫

问题描述:

我是Golang的新手。我正在寻找一种方式来做一些自定义的东西,用于封送和解组json。我找到了实施MarshallerUnmarshaller接口的解决方案。Go json Unmarshaller不叫

这是我struct与实现的接口(我还实施斯金格):

type Data struct { 
    Foo string `json:"foo"` 
    bar string 
} 

func (d Data) MarshalJSON() ([]byte, error) { 
    return []byte("{\"foo\":\"test\",\"bar\":\"data\"}"), nil 
} 

func (d Data) String() string { 
    return fmt.Sprintf("Foo: %s, bar: %s", d.Foo, d.bar) 
} 

func (d Data) UnmarshalJSON(b []byte) error { 
    d.bar = "testtest" 
    d.Foo = "data" 
    return nil 
} 

对于Marshaller一切正常:

data := &Data{} 
marshal, _ := json.Marshal(data) 
fmt.Println(string(marshal)) 

预期输出:

{“foo”:“test”,“bar”:“data”}

,我期待但Unmarshaller的不工作:

jsonData := "{\"foo\":\"test\"}" 
data := Data{} 
json.Unmarshal([]byte(jsonData), data) 
fmt.Println(data) 

此代码打印:

富:,酒吧:

有没有办法,我的东西在这里失踪?

这里有几个不同的问题。

  • 如果您想要修改接收器,则方法接收器必须是指针,否则您只修改局部方法的副本。你总是需要解组成一个指针。

  • 你声明的Foo领域"field" JSON标签,但传递"foo"

  • 你打电话json.UnmarshalUnmarshalJSON方法,它是将无限期递归内。

工作示例看起来像

func (d *Data) UnmarshalJSON(b []byte) error { 
    type data Data 
    tmp := &data{bar: "bar"} 
    err := json.Unmarshal(b, tmp) 
    if err != nil { 
     return err 
    } 
    *d = Data(*tmp) 
    return nil 
} 

func main() { 
    jsonData := "{\"field\":\"test\"}" 
    data := Data{} 
    json.Unmarshal([]byte(jsonData), &data) 
    fmt.Printf("%#v\n", data) 
} 

https://play.golang.org/p/FnF2li63dt

+0

对不起,该点数3,4是我的错。我在编辑器中进行了更改,但没有将其复制到此处。 –

+0

随着指针的工作,谢谢。但是我发现有点奇怪,你必须在一个指针上实现一个方法来完成这个工作。这对我来说不是很明显,也许只是因为我是Golang的新手 –

Data方法有值接收器,但可变数据有指针类型(*Data)。

指针类型变量不能使用具有值接收器的函数。要么更改变量类型或接收者类型。

另请参阅https://github.com/golang/go/wiki/CodeReviewComments#receiver-type关于接收器。