欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《golang多个字段具有相同的JSON标签名称》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都
欢迎各位小伙伴来到编程网,相聚于此都是缘哈哈哈!今天我给大家带来《golang多个字段具有相同的JSON标签名称》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!
如何将 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)
}
实际输出:
用户值:&{用户名:姓名:}
预期输出:
用户值:&{用户名:kishore 名称:kishore}
如何获取用 kishore
填充的 username
和 name
字段?
当我查看 json 的源代码时,我发现如果 2 个顶级字段具有相同的标记名称,它们就会丢弃。但是代码中的这个注释让我思考是否有一种方法可以同时标记 既标记又不标记
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
这实际上是重复结构标记导致解组器忽略它的情况。根据官方文档 - “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
终于介绍完啦!小伙伴们,这篇关于《Golang多个字段具有相同的json标签名称》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!
--结束END--
本文标题: Golang多个字段具有相同的json标签名称
本文链接: https://lsjlt.com/news/596401.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0