MarshalJSON是String声明的类型

时间:2017-08-03 18:50:46

标签: go

我创建了一个新的声明类型,并添加了一个方法来将值封送到JSON

<beforeloadfunction>beforeLoad</beforeloadfunction>

当我尝试封送类型的实例时,我得到返回的原始值。我错过了什么?

type TextOutput string

func (t *TextOutput) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf(`{"data": "%s"}`, t)), nil
}

2 个答案:

答案 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
}