我有一个结构,其中包含另一个结构作为值对象。
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: "johndoe@example.com"
}
}
}
但是我想要一些链接:
{
"user": {
"name": "John Doe",
"email": "johndoe@example.com"
}
}
答案 0 :(得分:6)
听起来您需要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
处理,因此应该可以正常工作。
答案 1 :(得分:0)
要使您的电子邮件类型按所需的方式编组,您需要使其实现json.marshaler接口。 GopherAcademy使用以下示例:
func (d Dog) MarshalJSON() ([]byte, error) {
return json.Marshal(NewJSONDog(d)) }