Свойства перечисления, Web API, десериализация JSON и опечатки - PullRequest
0 голосов
/ 17 мая 2018

Скажем, у нас есть такой класс:

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
}

Я заметил, что если я сделаю опечатку в *Тип 1007 * при выполнении запроса - ошибки не возникает, только объект, имеющий ошибочный enum, не будет десериализован.

Например, тело запроса может выглядеть следующим образом:

[{"name":"John", "bornOnDay":"Moonday",},
 {"name":"Mark", "bornOnDay":"Friday",},]

Конечная точка получит список, содержащий одного Person Марка, родившегося в пятницу.

Я бы хотел, чтобы операция post выполнялась полностью или не выполнялась, не только с объектами без опечаток enum. Есть ли способ сделать это без получения string вместоDayOfWeek, а затем с помощью Enum.TryParse(...) определить, что ввод был ошибочным?

Редактировать:

Я на самом деле хочу, чтобы ошибка произошла и была обнаруживаемой, чтобы я мог вернуть 400 код клиенту.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Что по этому поводу:

public class Person
{
     [JsonProperty]
     public string Name { get; protected set; }

     [JsonProperty]
     private string _BornOnDay { set {
       //try parse the string, if not successful, throw a nicely
       //formatted error with the original string and what you expect,
       //if parse is successful, set the value to BornOnDay;
     }}

     [JsonIgnore]
     public DayOfWeek BornOnDay { get; protected set; }
}

Не уверен насчет атрибута JsonConstructor, его никогда не нужно было использовать. Если вам это нужно, и если я правильно понимаю, у вас может быть что-то подобное. Десериализатор должен передать строку в конструктор, а затем внутри нее вы самостоятельно выполните логику синтаксического анализа для перечисления.

0 голосов
/ 17 мая 2018

вы можете сделать это так, вы можете создать enum-значение из введенной вами строки

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
     }
 }

Примечание: None добавляется в соответствии с Null Object Pattern , чтобы избежать проблем, связанных со значением null в системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...