如何更改Go结构中的JSON标记



我有一个看起来像的结构

type MediaFile struct {
ID                   string    `json:"id"`            
Secret               string    `json:"-"`
Title                string    `json:"title"`
}

我希望能够在满足条件时将Secret的脚本标记更改为json:"secret"

结构MediaFile在代码的其他部分中被引用了很多,因此使用不同名称的不同struct是不可行的。

我试着使用如下的指针。请注意,我已经删除了structMediafile的定义,如前所述。

type AlterMediaFile struct {
ID                   string    `json:"id"`            
Secret               string    `json:"secret"`
Title                string    `json:"title"`
}
type MediaFile struct {
*AlterMediaFile
}

但这导致我收到了很多升级后的字段错误,因为在这种情况下,AlterMediaFile基本上只是MediaFile的一个嵌套类。

那么,有什么简单的方法可以让我将"Secret"脚本标记从json:"-"更改为json:"secret"吗?

您不能在运行时将'Secret'脚本标记从json:"-"更改为json:"secret"

但是,可以使用omitempty选项json:"secret,omitempty"来指定,如果字段的值为空(在本例中为空字符串(,则应从编码中省略该字段。

当您的条件不满足时,您可以简单地将Secret字段设置为空字符串(这可以在数据库中完成(,它不会显示在json数据中。

您可以编写自己的MarshalJSON/UmarshalJSON方法。

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)
}

相关内容

  • 没有找到相关文章

最新更新