为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
小唯快跑啊 2022-08-24 11:14:34
我有一个看起来像这样的结构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"
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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

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

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


查看完整回答
反对 回复 2022-08-24
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

你可以编写自己的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)

}


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号