我有一个结构,其中包含另一个结构作为值对象。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 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
听起来你需要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,因此它应该可以正常工作。
倚天杖
TA贡献1828条经验 获得超3个赞
要使您的电子邮件类型按照您喜欢的方式编组,您需要使其实现json.marshaler接口。GopherAcademy使用以下示例:
func (d Dog) MarshalJSON() ([]byte, error) { return json.Marshal(NewJSONDog(d)) }
- 2 回答
- 0 关注
- 129 浏览
添加回答
举报
0/150
提交
取消