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