将具有多种日期时间格式的JSON响应解析为c#对象

问题描述

这是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 AM}返回availableDateLocalToSomeplace,对于{9/11/2020 10:30:00 AM}返回availableTimeLocalToSomeplace。我分别只想要9-10-202010:30:00 AM。 我不能放置这样的通用转换器设置:

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

因为我需要2种不同的格式类型。我该怎么做?

解决方法

在这种情况下,您可以这样做: 创建一个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)就可以正常工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...