将对象的值赋给json

时间:2018-11-14 07:06:43

标签: 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
}

我希望值对象是一个不变的对象,对于我的问题,这里也不需要“工厂”方法。

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

2 个答案:

答案 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)) }