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

如何将 JSON 解组为包含 2 个字段(UserName和Name)的结构,其中包含相同的 JSON 标记名称(name)?


package main


import (

    "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 tagged


func 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


宝慕林4294392
浏览 515回答 2
2回答

蛊毒传说

这实际上是重复结构标签导致 unmarshaller 忽略它的情况。根据官方文档-“3)否则有多个字段,所有字段都被忽略;不会发生错误。”https://golang.org/pkg/encoding/json/你可能应该做的是“去检查”,看看你的代码是否有这样的问题。

神不在的星期二

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go