我有一個結構,其中包含另一個結構作為值對象。type User struct { Name string `json:"name"`` Email valueobject.Email `json:"email"`}看起來valueobject.Email像這樣:type Email struct { value string}func (e *Email) Value() string { return e.Value}我希望值對象作為不可變對象,還有一個“工廠”方法,這對我的問題來說不是必需的。現在我想將 User 結構作為 json 返回,因此我使用response := map[string]interface{}{"user": User}json.NewEncoder(w).Encode(response)結果是:{ "user": { "name": "John Doe", "email": { "Email: "[email protected]" } }}但我想要一些鏈接:{ "user": { "name": "John Doe", "email": "[email protected]" }}
2 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
聽起來你需要valueobject.Email實現json.Marshaler接口:
func (e *Email) MarshalJSON() ([]byte, error) {
return json.Marshal(e.Value())
}
這是實現您所要求的最低限度。通過實現json.Marshaler接口,它允許您自定義如何json.Marshal呈現您的價值。
另一種選擇是簡化Email為 的包裝器string,而不是結構:
type Email string
func (e Email) Value() string {
return e
}
由于字符串已經由 處理json.Marshal,因此它應該可以正常工作。

倚天杖
TA貢獻1828條經驗 獲得超3個贊
要使您的電子郵件類型按照您喜歡的方式編組,您需要使其實現json.marshaler接口。GopherAcademy使用以下示例:
func?(d?Dog)?MarshalJSON()?([]byte,?error)?{ return?json.Marshal(NewJSONDog(d))?}
- 2 回答
- 0 關注
- 175 瀏覽
添加回答
舉報
0/150
提交
取消