c# - 枚举属性、Web API、JSON 反序列化和拼写错误

标签 c# asp.net enums

假设我们有这样一个类:

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/

相关文章:

c# - 如何在插入记录时使用存储过程防止 SQL 注入(inject)?

Javascript 未在 Internet Explorer 中实现错误

C++ - 将枚举类作为值或 const 引用传递更好吗?

ios - 如何使用枚举列表填充 UITableView?

c# - IELaunchURL() 返回 HRESULT 80070012 ('There are no more files.' )

c# - 结合正则表达式和 linq 在 C# 中分割字符串

c# - Web 服务器上的 WAV/MP3 转换

C# DateTime.AddMonth 下个月不存在日期

c# - 适用于 C# 的 Firebase REST API 示例

javascript - Angular:将字符串数组映射到 http get 调用中的枚举值数组