Использование Newtonsoft для десериализации штампа даты, который может состоять только из года - PullRequest
0 голосов
/ 31 августа 2018

Итак, у меня есть объект JSON, который содержит даты, когда кандидаты завершили свою степень. Форматы даты не особенно стандартизированы и могут состоять только из года, в котором они получили степень. Я пытаюсь десериализовать этот JSON с помощью Newtonsoft и получаю следующее исключение:

Исключение при чтении JSON: Newtonsoft.Json.JsonReaderException: Не удалось преобразовать строку в DateTime: 2003

Сообщение об исключении довольно простое: оно не распознает в качестве допустимого значения DateTime строки, состоящие только из года.

Есть ли способ, которым я могу это исправить (например, с помощью того, чтобы это всегда десериализовалось до 1 января указанного года), или я застрял, просто делая это поле строкой в ​​моем классе модели?

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

при десериализации,

Десериализуйте год как int и добавьте еще одно свойство, которое возвращает полную дату.

что-то вроде:

public class MyObject
{
  [JsonProperty("year")]
  public int Year { get; set; }

  [JsonIgnore]
  public DateTime FullDate() {
     return new DateTime (this.Year, 1, 1, 0, 0, 0);
  } 
}
0 голосов
/ 31 августа 2018

Если входной json может иметь разные форматы, вы всегда можете реализовать свой собственный JsonConverter, который обрабатывает необходимую логику.

Как реализовать собственный JsonConverter в JSON.NET для десериализации Списка объектов базового класса? есть несколько примеров, как это сделать. Это немного более многословно, но дает вам полный контроль над тем, как вы десериализуете данные.

0 голосов
/ 31 августа 2018

DateTime - это структура, которая всегда содержит точную точку в истории. Возможно, вы захотите рассмотреть возможность использования целочисленного члена для GraduationYear .

...