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

Golang 具有相同 json 标签名称的多个字段

Golang 具有相同 json 标签名称的多个字段

Go
宝慕林4294392 2022-06-13 10:54:31
如何将 JSON 解组为包含 2 个字段(UserName和Name)的结构,其中包含相同的 JSON 标记名称(name)?package mainimport (    "encoding/json"    "fmt")type User struct {    UserName string `json:"name,omitempty"`    Name     string `json:"name,omitempty"`}func main() {    data := []byte(`                {                    "name":"kishore"                }            `)    user := &User{}    err := json.Unmarshal(data, &user)    if err != nil {        panic(err)    }    fmt.Printf("value of user : %+v\n", user)}实际输出: value of user : &{UserName: Name:}预期输出: value of user : &{UserName:kishore Name:kishore}如何获得UserNameandName字段填充kishore?当我查看Json的源代码时,我发现如果 2 个顶级字段具有相同的标签名称,它们就会丢弃。但是代码中的这条评论让我想到是否有办法标记两者either both tagged or neither taggedfunc dominantField(fields []field) (field, bool) {    // The fields are sorted in increasing index-length order, then by presence of tag.    // That means that the first field is the dominant one. We need only check    // for error cases: two fields at top level, either both tagged or neither tagged.    if len(fields) > 1 && len(fields[0].index) == len(fields[1].index) && fields[0].tag == fields[1].tag {        return field{}, false    }    return fields[0], true}游乐场链接: https: //play.golang.org/p/TN9IQ8lFR6a
查看完整描述

2 回答

?
蛊毒传说

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

这实际上是重复结构标签导致 unmarshaller 忽略它的情况。根据官方文档-“3)否则有多个字段,所有字段都被忽略;不会发生错误。”

https://golang.org/pkg/encoding/json/

你可能应该做的是“去检查”,看看你的代码是否有这样的问题。


查看完整回答
反对 回复 2022-06-13
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

type User struct {

    UserName string `json:"name,omitempty"`

    Name     string `json:"-"`

}


func (u *User) UnmarshalJSON(data []byte) error {

    type U User

    if err := json.Unmarshal(data, (*U)(u)); err != nil {

        return err

    }

    u.Name = u.UserName

    return nil

}

https://play.golang.org/p/PRuigiBfwWv


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 514 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号