我有由具有给定属性的控制器接收的DTO模型
{
public string Name;
public DateTime DateProperty;
}
我的问题是,是否有任何方法可以将DateProperty从请求中正确序列化为DateTime和TimeStamp,例如,当我发送给定的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);
}
}
}