Как изменить тег 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)
}