首页 > 后端开发 > Golang > 如何在运行时动态更改 Go 结构中的 JSON 标签?

如何在运行时动态更改 Go 结构中的 JSON 标签?

Barbara Streisand
发布: 2024-12-21 15:46:10
原创
772 人浏览过

How Can I Dynamically Change JSON Tags in Go Structs at Runtime?

动态更改结构体中的 JSON 标签

问题

给定一个嵌套结构体的结构体,目标是动态修改结构体中的 JSON 标签在 JSON 对其进行编码之前,结构中的特定字段。所需的 JSON 输出是覆盖特定的字段名称。

解决方案

在 MarshalJSON 中使用匿名结构

Go 版本 1.8 及更高版本,可以采用一种技术在运行时动态更改字段的 JSON 标签。这涉及到在原始结构的 MarshalJSON 方法中创建一个具有所需字段标记的匿名结构。

func (u *User) MarshalJSON() ([]byte, error) {
    type alias struct {
        ID   int64  `json:"id"`
        Name string `json:"name"` // The modified JSON tag
        tag  string `json:"-"`
        Another
    }

    var a alias = alias(*u)
    return json.Marshal(&a)
}
登录后复制

这里,别名结构具有与 User 结构相同的字段,但 Name 字段具有所需的字段JSON 标签(“名称”而不是“第一个”)。通过返回别名结构体的 JSON 编码,可以动态覆盖 JSON 字段名称。

迭代所有字段

要迭代结构体的所有字段(包括嵌入的结构体),请使用反射包如下:

value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
    tag := value.Type().Field(i).Tag.Get("json")
    field := value.Field(i)
    fmt.Println(tag, field)
}
登录后复制

此代码将迭代所有字段,包括嵌入的 Another 结构中的字段,并打印 JSON每个字段的标签和字段值。

以上是如何在运行时动态更改 Go 结构中的 JSON 标签?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板