登录
首页 >  Golang >  Go问答

将JSON对象解组为自定义嵌套结构

来源:stackoverflow

时间:2024-03-26 21:09:32 285浏览 收藏

在 Go 中,有时需要将 JSON 对象解组为嵌套结构。传统方法涉及多次读取 JSON 数据,这既不高效也不优雅。本文提供了一种更简洁的替代方案,即使用包含结构来消除重复解析的需要。通过将嵌套数据直接放入包含结构中,Go 能够高效地解组 JSON 对象,而无需额外的处理步骤。

问题内容

假设我有两个这样相关的结构:

type secretuser struct {
    userinfo `json:"userinfo"`
    password string `json:"password"`
}

type userinfo struct {
    firstname string `json:"firstname"`
    lastname  string `json:"lastname"`
    email     string `json:"email"`
}

我收到了以下形式的 json:

{
    "firstname": "nice",
    "lastname":"guy",
    "email":"[email protected]",
    "password":"abc123"
}

我想将此 json 解组为 secretuser。还有比这样更好的方法吗?

func (u *User) UnmarshalJSON(data []byte) error {
    var objmap map[string]*json.RawMessage
    var password string
    var err error

    err = json.Unmarshal(data, &objmap)
    if err != nil {
        return err
    }

    if err := json.Unmarshal(data, &u.UserInfo); err != nil {
        return err
    }
    
    err = json.Unmarshal(*objmap["password"], &password)
    if err != nil {
        return err
    }

    u.Password = password
    return nil
}

基本上,我将 json 部分解组到 userinfo 结构中,然后再次读取它以提取密码。我不想创建另一个结构来干净地解组此 json 或使用外部库(除非它是标准的一部分)。是否有更干净/高效的方法来执行此操作,而无需读取 json 两次或从地图手动设置每个字段?


正确答案


只需将 userdata 包含到 secretuser 结构中,并且不要为其指定 json 标签。

type UserInfo struct {
    FirstName string `json:"firstName"`
    LastName  string `json:"lastName"`
    Email     string `json:"email"`
}

type SecretUser struct {
    UserInfo
    Password string `json:"password"`
}

func main() {
    data := []byte(`{"firstName": "nice","lastName":"guy","email":"[email protected]","password":"abc123"}`)
    var u SecretUser
    json.Unmarshal(data, &u)
    fmt.Println(u)
}

Go Play Space example

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>