如何将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}
如何获取UserName
填充的Name
和kishore
字段?
当我查看Json的源代码时,如果两个顶级字段具有相同的标签名称,它们就会被丢弃。但是这段代码注释使我思考是否有一种方法可以同时标记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
}
答案 0 :(得分:1)
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
}
答案 1 :(得分:1)
这实际上是重复的struct标签的情况,导致unmarshaller忽略它。根据官方文档-“ 3)否则,存在多个字段,所有字段都将被忽略;不会发生错误。”
https://golang.org/pkg/encoding/json/
您可能应该做的是“检查”,看看您的代码是否存在此类问题。