给定一个嵌套结构体的结构体,目标是动态修改结构体中的 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中文网其他相关文章!