0

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

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

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

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

我尝试使用如下指针。请注意,我已经删除了 struct 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"

4

2 回答 2

2

您不能在运行时将“秘密”脚本标记从json:"-"更改为。json:"secret"

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

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

于 2021-04-04T07:28:48.073 回答
0

您可以编写自己的 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)
}
于 2021-04-04T15:22:15.227 回答