go中json的值对象

go中json的值对象,json,go,Json,Go,我有一个结构,其中包含另一个结构作为值对象 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 } 我想把

我有一个结构,其中包含另一个结构作为值对象

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
}
我想把value对象作为一个不可变的对象,这里还有一个“工厂”方法,这对我的问题来说是不必要的

现在我想以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"
    }
}

听起来您需要
valueobject.Email
来实现
json.Marshaler
接口:

func (e *Email) MarshalJSON() ([]byte, error) {
  return json.Marshal(e.Value())
}
这是实现你要求的最低限度。通过实现
json.Marshaler
接口,您可以自定义
json.marshall
如何呈现您的值

另一种选择是将
电子邮件
简化为
字符串
的包装,而不是结构:

type Email string

func (e Email) Value() string {
  return e
}

由于字符串已经由
json.Marshal
处理,因此它应该可以正常工作。

要使您的电子邮件类型按照您希望的方式进行封送,您需要使其实现接口。使用以下示例:

func (d Dog) MarshalJSON() ([]byte, error) {
return json.Marshal(NewJSONDog(d)) }