为了账号安全,请及时绑定邮箱和手机立即绑定

go中json的值对象

go中json的值对象

Go
慕少森 2023-05-08 16:07:29
我有一个结构,其中包含另一个结构作为值对象。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,因此它应该可以正常工作。


查看完整回答
反对 回复 2023-05-08
?
倚天杖

TA贡献1828条经验 获得超3个赞

要使您的电子邮件类型按照您喜欢的方式编组,您需要使其实现json.marshaler接口。GopherAcademy使用以下示例:

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


查看完整回答
反对 回复 2023-05-08
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信