这是问题的原地址:
[http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method](http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method "http://stackoverflow.com/questions/38489776/idiomatic-way-to-embed-struct-with-custom-marshaljson-method")
目前我遇到,解决方法是有的,但找不到比较好的解决方法,具体我用中文重新表述问题。
给出下面的一个结构:
```go
type Person {
Name string `json:"name"`
}
type Employee {
Person
JobRole string `json:"jobRole"`
}
```
我可以很轻松地转换成我想需要的JSON字符串格式,例子如下:
```go
p := Person{"Bob"}
e := Employee{&p, "Sales"}
output, _ := json.Marshal(e)
fmt.Printf("%s\n", string(output))
```
输出的内容:
> {"name":"Bob","jobRole":"Sales"}
但是当我定义了一个自定义的MarshalJSON()方法后……
```go
func (p *Person) MarshalJSON() ([]byte,error) {
return json.Marshal(struct{
Name string `json:"name"`
}{
Name: strings.ToUpper(p.Name),
})
}
```
同样的输出代码:
```go
p := Person{"Bob"}
e := Employee{&p, "Sales"}
output, _ := json.Marshal(e)
fmt.Printf("%s\n", string(output))
```
结果却变了
> {"name":"BOB"}
很明显,这个输出缺少了`jobRole`字段的内容
我们很容易知道原因,因为里面的匿名字段`Person`结构体实现了`MarshalJSON()`方法,所以这个方法被调用了。
麻烦的是,这不是我想要的结果,我想要的结果是这样的:
> {"name":"BOB","jobRole":"Sales"}
现在,我添加了一个`MarshalJSON()`方法到`Employee`结构体中,如下:
```go
func (e *Employee) MarshalJSON() ([]byte,error) {
return json.Marshal(struct{
Person
JobRole string `json:"jobRole"`
}{
Person: e.Person,
JobRole: e.JobRole,
})
}
```
但我仍要输出匿名字段`Person`的内容,那么就必定会调用`Person`结构体里面的`MarshalJSON()`方法,这样一下,整个过程变成了一个死循环,得出的结果仍然是:
> {"name":"BOB"}
变成了一个“先有鸡还是先有蛋”的过程。
大家有没有什么好的办法解决?
有疑问加站长微信联系(非本文作者)