【发布时间】:2019-12-01 06:34:38
【问题描述】:
我有以下模型代码:
public class Sensor
{
public long Id { get; set; }
[Required]
public string Tag { get; set; }
public DateTime Timestamp { get; set; }
public string Status { get; set; }
public int Valor { get; set; }
}
我正在通过 WebAPI 控制器通过 POST 方法接收此信息。
这是 POST 方法的签名:
public async Task<ActionResult<Sensor>> PostSensor(Sensor sensor)
它接收像这个例子这样的值:
{
"tag": "mytag",
"Timestamp": "1575179924",
"valor": "3000"
}
我的问题是由于控制器的签名,它尝试验证时间戳,但由于 UNIX 时间戳不是 DateTime 时间戳而失败。
我想在这个方法中转换它,但这需要禁用整个控制器的验证。
我尝试创建一个 JSON 转换器,但总是无法转换。
public class UnixEpochTimeToDateTimeConverter: Newtonsoft.Json.JsonConverter
{
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
if (!reader.Path.ToLower().Contains("time")) return null;
var parsed = long.TryParse(reader.Value.ToString(), out var unixTimeStamp);
if(!parsed){ return null; }
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var timeSpan = TimeSpan.FromSeconds(unixTimeStamp);
var localDateTime = epoch.Add(timeSpan).ToLocalTime();
return localDateTime;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DateTime);
}
}
(我收到此错误:无法将 JSON 值转换为 System.DateTime。路径:$.Timestamp)
有解决办法吗?也许另一种转换方式? (我真的不知道我做错了什么)
【问题讨论】:
-
是的,我在谷歌搜索时看到了这个方法的一些实现,但由于某种原因它仍然失败。作为一种解决方法,我创建了一个“UnixSensor”模型类,它接收标签、时间戳和值。我禁用了自动验证并手动进行了转换(将 UnixSensor 的数据转换并传输到 Sensor 的模型,然后保存在数据库/回复客户端)。不过,这听起来像一个非常丑陋的方法,不确定它是否是唯一的方法。
-
当然这并不能解决您的问题,只是说明这将是您代码中 DateTime/TimeSpan 数学的内置替代方案。
-
this 不是已经在做你想做的事了吗?
-
我也尝试使用这个转换器作为时间戳的注释,它给了我和我写的转换器一样的错误。