我有一个结构,其中包含一个其他结构作为值对象.
type User struct {
Name string `json:"name"``
Email valueobject.Email `json:"email"`
}
Run Code Online (Sandbox Code Playgroud)
该valueobject.Email如下所示:
type Email struct {
value string
}
func (e *Email) Value() string {
return e.Value
}
Run Code Online (Sandbox Code Playgroud)
我想将value对象作为一个不可变对象,这里也有一个"工厂"方法对我的问题不是必需的.
现在我想将用户结构作为json返回,因此我使用它
response := map[string]interface{}{"user": User}
json.NewEncoder(w).Encode(response)
Run Code Online (Sandbox Code Playgroud)
结果是:
{
"user": {
"name": "John Doe",
"email": {
"Email: "johndoe@example.com"
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我想要一些链接:
{
"user": {
"name": "John Doe",
"email": "johndoe@example.com"
}
}
Run Code Online (Sandbox Code Playgroud)
听起来你需要valueobject.Email实现json.Marshaler界面:
func (e *Email) MarshalJSON() ([]byte, error) {
return json.Marshal(e.Value())
}
Run Code Online (Sandbox Code Playgroud)
这是实现您要求的最低要求.通过实现json.Marshaler界面,它允许您自定义json.Marshal呈现值的方式.
另一个选择是简化Email为一个包装器string,而不是一个结构:
type Email string
func (e Email) Value() string {
return e
}
Run Code Online (Sandbox Code Playgroud)
由于字符串已经处理过json.Marshal,它应该可以正常工作.