go中的json值对象

Mar*_*par 3 json go

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

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)

Dom*_*nes 6

听起来你需要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,它应该可以正常工作.