猿问

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

我有一个看起来像这样的结构


type MediaFile struct {

    ID                   string    `json:"id"`            

    Secret               string    `json:"-"`

    Title                string    `json:"title"`

}

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


结构 MediaFile 在代码的其他部分中已被大量引用,因此使用具有不同名称的不同结构是不可行的。


我试图使用像下面这样的指针。请注意,我已经删除了结构媒体文件的定义,如前面的示例所示。


type AlterMediaFile struct {

    ID                   string    `json:"id"`            

    Secret               string    `json:"secret"`

    Title                string    `json:"title"`

}


type MediaFile struct {

    *AlterMediaFile

}

但它导致我收到了很多升级字段错误,因为它的AlterMediaFile基本上只是MediaFile的嵌套类。


那么,有没有简单的方法可以让我能够将“秘密”脚本标签从更改为?json:"-"json:"secret"


小唯快跑啊
浏览 91回答 2
2回答

炎炎设计

您不能在运行时将“Secret”脚本标记从 更改为 。json:"-"json:"secret"但是,可以使用 选项 ,指定如果字段具有空值(在本例中为空字符串),则应从编码中省略该字段。omitemptyjson:"secret,omitempty"当不满足条件时,您只需将字段设置为空字符串(这可以通过数据库完成),它就不会显示在json数据中。Secret

慕码人8056858

你可以编写自己的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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答