假设我们有这样一个类:
public class Person
{
[JsonConstructor]
public Person(string name, DayOfWeek bornOnDay) => (Name, BornOnDay) = (name, bornOnDay);
public string Name { get; protected set; }
public DayOfWeek BornOnDay { get; protected set; }
}
还有像这样的端点:
[HttpPost]
[Route("api/people")]
public IHttpActionResult PostPerson([FromBody]List<Person> people)
{
// whatever
}
我注意到如果我在发出请求时在 enum
类型中输入错误 - 不会发生错误,只有具有错误 enum
的对象不会被反序列化。
例如,请求正文可能如下所示:
[{"name":"John", "bornOnDay":"Moonday",},
{"name":"Mark", "bornOnDay":"Friday",},]
Endpoint 将收到包含一个 Person
的列表,Mark 出生于星期五。
我想让后操作要么完全发生,要么失败,而不仅仅是没有 enum
拼写错误的对象。有没有办法做到这一点,而不收到 string
而不是 DayOfWeek
,然后使用 Enum.TryParse(...)
确定输入有误?
编辑:
我实际上希望错误发生并可检测到,这样我就可以将 400
代码返回给客户端。
最佳答案
你可以这样做,你可以从你输入的字符串创建枚举值
public class Person
{
private string day;
[JsonConstructor]
public Person(string name, string bornOnDay){
this.Name = name;
this.day = bornOnDay;
}
public string Name { get; protected set; }
public DayOfWeek BornOnDay {
get {
DayOfWeek weekday;
if(Enum.TryParse(day, true, out weekday))
return weekday;
else
return DayOfWeek.None;//add none if no able to parse
}
}
注意:无
是根据Null Object Pattern添加的以避免与系统中的 null
值相关的问题。
关于c# - 枚举属性、Web API、JSON 反序列化和拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50385761/