我有一个看起来像的结构
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)
}