2017-08-03 29 views
0

我创建了一个新的声明类型和添加的方法将值编组到JSONMarshalJSON一个字符串声明的类型

type TextOutput string 

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

当我尝试元帅我得到的原始值的返回类型的实例。我错过了什么?

var t TextOutput 
t = `Test test` 
output, err := json.Marshal(t) 
if err != nil { 
    fmt.Println(err) 
} else { 
    fmt.Println(string(output)) 
} 
// prints Test Test. Expected {"data": "Test test"} 
+1

你的'UnmarshalJSON'方法在哪里? – Flimzy

回答

1

问题的根源来自于围棋的接口是如何满足隐茎。
在这种特殊情况下,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 
} 
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"}