如何更改 Go 结构中的 JSON 标记?
How do I change the JSON tag within a Go struct?
我的结构看起来像这样
type MediaFile struct {
ID string `json:"id"`
Secret string `json:"-"`
Title string `json:"title"`
}
我希望能够在满足条件时将 Secret 的脚本标记更改为 json:"secret"
。
结构体 MediaFile 在代码的其他部分被多次引用,因此使用具有不同名称的不同结构体是不可行的。
我尝试使用如下指针。请注意,我已经删除了之前在以下示例中看到的 struct Mediafile 的定义。
type AlterMediaFile struct {
ID string `json:"id"`
Secret string `json:"secret"`
Title string `json:"title"`
}
type MediaFile struct {
*AlterMediaFile
}
但这导致我收到很多提升的字段错误,因为在这种情况下,AlterMediaFile 基本上只是 MediaFile 的嵌套 class。
那么,有什么简单的方法可以让我将 'Secret' 脚本标签从 json:"-"
更改为 json:"secret"
吗?
您不能在运行时将 'Secret' 脚本标记从 json:"-"
更改为 json:"secret"
。
但是,您可以使用 omitempty
选项 json:"secret,omitempty"
来指定如果字段具有空值(在本例中为空字符串),则应从编码中省略该字段).
当您的条件不满足时,您只需将 Secret
字段设置为空字符串(这可以通过您的数据库完成)并且它不会显示在 json数据.
您可以编写自己的 MarshalJSON/UnmarshalJSON 方法。
type MediaFile struct {
ID string
Secret string
Title string
}
type jsonMediaFile struct {
ID string `json:"id"`
Title string `json:"title"`
}
type jsonSecretMediaFile struct {
*jsonMediaFile
Secret string `json:"secret"`
}
func (mf *MediaFile) MarshalJSON() ([]byte, error) {
jsonMF := jsonMediaFile{
ID: mf.ID,
Title: mf.Title,
}
if isNeedMarshalSecret() {
return json.Marshal(jsonSecretMediaFile{
jsonMediaFile: &jsonMF,
Secret: mf.Secret,
})
}
return json.Marshal(jsonMF)
}