Как запретить невалидные значения enum?
Задумался вдруг о вопросе как десериализуется default(int) для enum'ов и обнаружил неприятное для себя поведение: Json.Net по умолчанию спокойно конвертирует и не падает с ошибкой.
Простой пример:
var data = "{ 'Sex': 0 }";
var result = JsonConvert.DeserializeObject<Person>(data);
result.Dump();
Где класс и перечисление:
public class Person
{
//[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex { get; set; }
}
public enum Sex
{
Male = 1,
Female = 2,
}
Никакого исключения не падает, на выходе:
Как поменять это поведение, чтобы Json.Net валидировал значения и падал?
Пока просто подавил проблему, у меня в проекте подключен FluentValidation и добавил проверку на уровне уже после десериализации:
public class CommandValidator : AbstractValidator<Command>
{
public CommandValidator()
{
RuleFor(x => x.Person.Sex).IsInEnum();
}
}
Но я что-то не уверен, что я буду постоянно пользоваться этой библиотекой, хочу обойтись только Json.Net
Ответы (2 шт):
Автор решения: Bulson
→ Ссылка
Наверное, можно так
public class Person
{
[JsonIgnore]
public Sex Sex { get; set; }
[JsonProperty("Sex")]
public string SexString
{
get => Sex.ToString();
set
{
var sex = (Sex)Enum.Parse(typeof(Sex), value);
if (sex <= 0 || (int)sex > 2)
{
throw new Exception("Ошибка в значении, ааа!");
}
Sex = sex;
}
}
}
Автор решения: A K
→ Ссылка
Решил, что зря перемудрил с Int'ами и по совету @tym32167 вернулся к строкам:
void Main()
{
var data = "{ 'Sex': 'Male' }";
var result = JsonConvert.DeserializeObject<Person>(data);
result.Dump();
}
// Define other methods and classes here
public class Person
{
[JsonConverter(typeof(StringEnumConverter))]
public Sex Sex { get; set; }
}
public enum Sex
{
Male = 1,
Female = 2,
}
