2017-08-03 64 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"}