猿问

go中json的值对象

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


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"

    }

}


慕少森
浏览 130回答 2
2回答

泛舟湖上清波郎朗

听起来你需要valueobject.Email实现json.Marshaler接口:func (e *Email) MarshalJSON() ([]byte, error) {  return json.Marshal(e.Value())}这是实现您所要求的最低限度。通过实现json.Marshaler接口,它允许您自定义如何json.Marshal呈现您的价值。另一种选择是简化Email为 的包装器string,而不是结构:type Email stringfunc (e Email) Value() string {  return e}由于字符串已经由 处理json.Marshal,因此它应该可以正常工作。

倚天杖

要使您的电子邮件类型按照您喜欢的方式编组,您需要使其实现json.marshaler接口。GopherAcademy使用以下示例:func (d Dog) MarshalJSON() ([]byte, error) { return json.Marshal(NewJSONDog(d)) }
随时随地看视频慕课网APP

相关分类

Go
我要回答