Десериализуйте строку JSON, имеющую несколько форматов даты и времени, в объект c #

#c# #json #.net #json-deserialization

#c# #json #.net #json-десериализация

Вопрос:

Это и есть ответ JSON:

 {
  "data": [
    {
      "someTicketNumber": "123456",
      "callInDateTimeUtc": "2020-09-09T20:16:26Z",
      "lastUpdatedDateTimeUtc": "2020-09-09T20:28:11Z",
      "availableDateLocalToSomeplace": "2020-09-10",
      "availableTimeLocalToSomeplace": "T10:30:00Z"
    }
  ]
}
  

Фактический результат JsonConvert.DeserializeObject<T>(json) :

Доступный отель находится на другом месте Доступное время находится в другом месте
9/10/2020 12:00:00 УТРА 9/11/2020 10:30:00 УТРА

Мой ожидаемый результат:

Доступный отель находится на другом месте Доступное время находится в другом месте
9/10/2020 10:30:00 УТРА

Я не могу установить общие настройки конвертера, подобные этому:

 JsonConvert.DeserializeObject<T>(json, new 
JsonSerializerSettings
{
    DateFormatString = "yyyy-MM-dd" OR "THH:mm:ssZ"
});
  

потому что мне нужны 2 разных типа формата даты и времени. Как мне этого добиться?

Ответ №1:

В этом случае вы можете поступить следующим образом: создайте CustomDateTimeConverter класс и передайте формат его конструктору, вот так

 public class DateFormatConverter : IsoDateTimeConverter
{
    public DateFormatConverter(string format)
    {
        DateTimeFormat = format;
    }
}
  

В классе c #,

 public partial class Tickets
{
    [JsonProperty("data")]
    public TicketProps[] Data { get; set; }
}

public partial class TicketProps
{
    [JsonProperty("someTicketNumber")]
    public string SomeTicketNumber { get; set; }

    [JsonProperty("callInDateTimeUtc")]
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-ddTHH:mm:ssZ")]
    public DateTime? CallInDateTimeUtc { get; set; }

    [JsonProperty("lastUpdatedDateTimeUtc")]
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-ddTHH:mm:ssZ")]
    public DateTime? LastUpdatedDateTimeUtc { get; set; }

    [JsonProperty("availableDateLocalToSomeplace")]
    [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")]
    public DateTime?AvailableDateLocalToSomeplace { get; set; }

    [JsonProperty("availableTimeLocalToSomeplace")]
    [JsonConverter(typeof(DateFormatConverter), "THH:mm:ssZ")]
    public DateTime? AvailableTimeLocalToSomeplace { get; set; }
}
  

Теперь ваш простой JsonConvert.DeserializeObject<T>(json) будет работать просто отлично.