当前位置: 首页 > 面试题库 >

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

麻桐
2023-03-14
问题内容

我有一个javascript函数,它使用JSON数据调用MVC控制器:

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

在服务器端,在控制器内,我似乎无法克服此错误:

/ Date(1347992529530)/不是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);
    }

我一直在做一些谷歌搜索,上面的代码是我做这项工作的最新尝试(使用此处的TimeSpanJsonConverter
)。其他方法显示仅向服务器发送日期,但是我有一些具有日期作为某些属性的对象的列表。

是否有一种优雅的,通常被接受的方法来解决此问题,还是我们仍然需要某种丑陋的解决方法?解决这个问题的正确方法是什么?

===================原始问题的结尾===================

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

请参阅下面的 答案 (而不是此问题中的work脚解决方法)。

编辑-糟糕的解决方法

我创建的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序列化数据。经过大量的搜索之后,我发现本文显示了如何使用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,后端的反序列化就可以了。



 类似资料:
  • 奇怪的是下面的测试用例会失败。有人知道为什么吗?

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 问题内容: 我正在尝试反序列化具有JavaScript日期的json对象。在对象上调用JSON.stringify时,日期会序列化为未正确反序列化回日期的字符串。我尝试使用带有chrome,IE和FF的本机浏览器实现以及使用jquery来反序列化对象。两者都给出了一些结果。这是代码段: 我希望objDeser.Date是js日期而不是字符串。您可以在此处查看此问题的实际使用情况:http : //

  • 问题内容: 将日期转换为JSON时,javascript会以以下格式保存日期: 但是,我不确定如何将其放入python datetime对象。我已经尝试过这些: 我相信javascript会将字符串保存为官方ISO格式,因此似乎应该有一种方法可以让python 读取它? 问题答案: 请尝试以下格式: 例如: 该的日期只是手段,它应该被解释为UTC时间,所以忽略它不会造成任何信息丢失。您可以在这里找

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 问题内容: 我在具有Excel Date序列号Date的csv文件中得到了名为DateOfBirth的列 例子: 当我在excel中格式化单元格时,这些将转换为 我需要在SSIS或SQL中进行此转换。如何做到这一点? 问题答案: 在SQL中: