我创建了一个新的声明类型,并添加了一个方法来将值封送到JSON
<beforeloadfunction>beforeLoad</beforeloadfunction>
当我尝试封送类型的实例时,我得到返回的原始值。我错过了什么?
type TextOutput string
func (t *TextOutput) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`{"data": "%s"}`, t)), nil
}
答案 0 :(得分:2)
您必须将MarshalJSON
接口定义为非指针。
func (t TextOutput) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`{"data": "%s"}`, t)), nil
}
播放链接:https://play.golang.org/p/lLK6zsAkOi
输出:
{"data":"Test test"}
答案 1 :(得分:1)
问题的根源在于如何隐含地满足Go中的接口
在这种特殊情况下,json.Marshal
方法在运行时使用类型断言来查看给定值是否实现json.Marshaler
。有效转到mentions this very case。
您可以使用指针接收器满足json.Marshaler
类型的*TextOutput
,如下所示:
func (t *TextOutput) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`{"data":"%s"}`, *t)), nil
}
为了使其正常工作,请将引用传递给json.Marshal
函数:
var t TextOutput
t = `Test test`
output, err := json.Marshal(&t)
但是,使用值接收器实现它可确保TextOutput
和*TextOutput
类型实现json.Marshaler
func (t TextOutput) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`{"data": "%s"}`, t)), nil
}