gpt4 book ai didi

c# - 在反序列化期间将 JSON 日期转换为 .NET DateTime 的正确方法

转载 作者:可可西里 更新时间:2023-11-01 01:29:54 24 4
gpt4 key购买 nike

我有一个使用 JSON 数据调用 MVC Controller 的 javascript 函数:

var specsAsJson = JSON.stringify(specs);
$.post('/Home/Save', { jsonData: specsAsJson });

在服务器端,在 Controller 内,我似乎无法克服这个错误:

/Date(1347992529530)/ is not a valid value for DateTime.

该异常发生在我调用 Deserialize() 时(下面方法中的第三行):

    public ActionResult Save(string jsonData)
{
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new TimeSpanJsonConverter() });
var specs = serializer.Deserialize<List<EquipmentSpecWithParameterlessConstructor>>(jsonData);

return View("Index", _allTrackerJobs);
}

我一直在进行一些谷歌搜索,上面的代码是我为完成这项工作所做的最新尝试(使用来自 here 的 TimeSpanJsonConverter)。其他方法显示仅向服务器发送日期,但我有一个对象列表,其中包含日期作为某些属性。

是否有一种优雅的、普遍接受的方法来解决这个问题,或者我们是否仍然需要某种丑陋的解决方法?解决此问题的正确方法是什么?

===================原题结束===================


编辑 - 通过使用 JsonConvert 序列化解决

请参阅下面我的答案(不是这个问题中糟糕的解决方法)。


编辑 - 蹩脚的解决方法

我创建了一个 DTO,其字段与域对象完全相同,只是我将日期字段设为字符串以便它们反序列化。现在我可以反序列化它了,我将努力将日期转换为有效格式,以便我可以从我的 DTO 创建域对象。

public class EquipmentSpecDto
{
public string StartTime { get; set; }
public string EndTime { get; set; }
// more properties here
}

我只是使用 DTO 进行反序列化:

var specs = serializer.Deserialize<List<EquipmentSpecDto>>(jsonData);

编辑 2 - 将 JavaScript 日期转换为 .NET

为了完整起见,并希望我能为其他人节省一个小时,这就是我能够转换 javascript 日期的方式:

    foreach (EquipmentSpecDto specDto in specDtos)
{
// JavaScript uses the unix epoch of 1/1/1970. Note, it's important to call ToLocalTime()
// after doing the time conversion, otherwise we'd have to deal with daylight savings hooey.
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Double startMilliseconds = Convert.ToDouble(specDto.StartTime.Substring(6, 13));
Double endMilliseconds = Convert.ToDouble(specDto.EndTime.Substring(6, 13));
DateTime startTime = unixEpoch.AddMilliseconds(startMilliseconds).ToLocalTime();
DateTime endTime = unixEpoch.AddMilliseconds(endMilliseconds).ToLocalTime();
EquipmentSpec spec = new EquipmentSpec(startTime, endTime, specDto.Equipment);

specs.Add(spec);
}

最佳答案

我找到了一个简单的答案。在我的 javascript 中,我使用 JavaScriptSerializer 序列化数据。经过多次谷歌搜索,我发现了这个 article这显示了如何使用 JsonConvert 进行序列化,从而导致使用对 .NET 更友好的 DateTime。

旧:

var specs = @Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewBag.JobSpecEquipment))

日期看起来像这样:Date(1348017917565)

新:

var specs = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.JobSpecEquipment));

日期如下所示:2012-09-18T21:27:31.1285861-04:00

所以问题实际上是我一开始是如何序列化的。一旦我使用 JsonConvert,后端的反序列化就可以简单地工作了。

关于c# - 在反序列化期间将 JSON 日期转换为 .NET DateTime 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com