在.NET核心的控制器中的同一DTO属性处同时接受时间戳类型和DateTime类型



我有由具有给定属性的控制器接收的DTO模型

{
public string Name;
public DateTime DateProperty;
} 

我的问题是,是否有任何方法可以将DateProperty从请求中正确序列化为DateTimeTimeStamp,例如,当我发送给定的POST请求时:

"Name": "Sample Name",
"DateProperty": "1583524428"

我收到以下错误:无法将字符串转换为DateTime:1583524428。路径"结束",第4行,位置20。"。显然,当我发送正确的请求(下面(时,一切都好。

"Name": "Sample Name",
"DateProperty": "2020-02-21T10:25"

是否有任何方法可以检测DatePropery是否为TimeStamp,如果是,请在中间件返回转换错误之前将其转换为DateTime

EDIT我通过实现DateTimeConverter 解决了这个问题

public class DateTimeConverter : JsonConverter<DateTimeOffset>
{
public override DateTimeOffset ReadJson(JsonReader reader, Type objectType, DateTimeOffset existingValue, bool hasExistingValue, Newtonsoft.Json.JsonSerializer serializer)
{
return ConvertFromUnixTimestamp(reader.Value.ToString());
}
private static DateTimeOffset ConvertFromUnixTimestamp(string timestamp)
{
DateTimeOffset origin = new DateTimeOffset();
origin = DateTimeOffset.FromUnixTimeSeconds(Int64.Parse(timestamp));
return origin;
}
}

在Startup.cs

services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(newDateTimeConverter());
})

DateTime类型不知道您是在以区域性格式发送时间戳还是日期-时间值。我克服这一问题的一种方法是将属性设置为字符串,并添加第二个DateTime类型的只读属性,然后自己计算。


public class MyDTO {
public string dateProperty {get; set;}
public DateTime? DatePropertyAsDateTime {
get {
if(String.IsNullOrWhiteSpace(dateProperty)) return null;
double nixTimeStamp = 0;
//see if the DateProperty is a double number.
if(Double.TryParse(dateProperty, out nixTimeStamp))
{
DateTime ts = new DateTime(1970, 1, 1, 0, 0, 0, 0);
return ts.AddSeconds(nixTimeStamp);
}
//If not, just try to parse it to DateTime.
return DateTime.Parse(dateProperty);
}
}
}