如何更改 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)
}