Как изменить тег JSON в структуре Go?

У меня есть структура, которая выглядит так

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

Я хочу иметь возможность изменять тег скрипта для 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.

Итак, есть ли какой-нибудь простой способ изменить тег скрипта Secret с json:"-" к json:"secret" ?

2 ответа

Решение

Вы не можете изменить тег скрипта "Секрет" из 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)
}
Другие вопросы по тегам