Golang:使用私有字段解组嵌套结构

时间:2021-04-27 00:20:16

标签: go

你好,我想将一个 json 传递给一个结构,以防我有实体和值对象,并且在我所有的值对象中我有方法:UnmarshalText、MarshalJSON 将我的 struct 转换为 json 工作正常,但我无法想象如何从 json 转换为 struct 在我从我的个人实体数据库中获取数据的场景中,我需要将此数据转换为要返回的结构人

for rows.Next() {
    var id, firstName, lastName, email, password string
    var createdAt, updatedAt time.Time

    err = rows.Scan(&id, &firstName, &lastName, &email, &password,
        &createdAt, updatedAt)
    if err != nil {
        log.Printf("Failed to build item: %v\n", err)
        return persons, err
    }

}

到目前为止,我在原始数据中有我的字段,我需要将其转换为我的结构人,即:

type Person struct {
    Id       string    `json:"id"`
    Name     Name      `json:"name"`
    Email    Email     `json:"email"`
    Password Password  `json:"-"`
    Created  time.Time `json:"createdAt"`
    Updated  time.Time `json:"updatedAt"`
}

正如我之前所说的,我所有的对象值,如电子邮件、姓名、密码 有私有字段,我在其中有 unmarshal 和 marshal 方法 我想知道是否有任何方法可以将 json 传递给我的 struct Person

电子邮件结构:

type Email struct {
    value string
}

密码结构:

type Password struct {
    value string
}

名称结构:

type Name struct {
    firstName string
    lastName  string
}

在我所有的“值对象结构中,我有两种方法”:

//name
func (n *Name) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        FirstName string `json:"firstName"`
        LastName  string `json:"lastName"`
    }{
        FirstName: n.FirstName(),
        LastName:  n.LastName(),
    })
}

func (n *Name) UnmarshalText(f []byte, l []byte) error {
    var err error
    *n, err = NewName(string(f), string(l))
    return err
}
//password
func (n *Password) UnmarshalText(d []byte) error {
    var err error
    *n, err = NewPassword(string(d))
    return err
}

func (e *Password) MarshalJSON() ([]byte, error) {
    return json.Marshal(e.Value())
}
//email
func (e *Email) MarshalJSON() ([]byte, error) {
    return json.Marshal(e.Value())
}

func (n *Email) UnmarshalText(d []byte) error {
    var err error
    *n, err = NewEmail(string(d))
    return err
}

0 个答案:

没有答案