【问题标题】:Serializing DateTime property to work in javascript序列化 DateTime 属性以在 javascript 中工作
【发布时间】:2020-03-16 21:22:47
【问题描述】:

我有一个具有 DateTime 属性的 c# 对象列表,我使用 NewtonSoft 对其进行序列化

result = Newtonsoft.Json.JsonConvert.SerializeObject( PagedZoningCases );

这使得 DateTime 出来为:

CallDateTime: "2017-04-17T17:06:00"

但这在javascript中不好,所以我尝试了以下

result = Newtonsoft.Json.JsonConvert.SerializeObject( PagedZoningCases, new Newtonsoft.Json.Converters.JavaScriptDateTimeConverter);

这更好一点,它会产生以下结果:

CallDateTime: "新日期(1396496760000)"

当我将结果返回到页面并在 javascript 中执行 JSON.parse(result) 时会引发错误

我执行了以下测试以查看 javascript 的预期:

    var date = new Date();
    console.log(date); //Thu Nov 21 2019 15:29:33 GMT+1300 (New Zealand Daylight Time)
    var json = JSON.stringify(date);
    console.log(json); //"2019-11-21T02:29:33.392Z"
    var date2 = new Date(dateStr);
    console.log(date2); //Thu Nov 21 2019 15:29:33 GMT+1300 (New Zealand Daylight Time)

所以 NewtonSoft 的转换器似乎没有将日期转换为正确的值以在 Date() 函数中工作。它给出了过去纪元的毫秒数,但 javascript 并没有预料到这一点。

如何从 c# 序列化 DateTime 并通过 JSON 将其解析为 javascript 日期对象?

【问题讨论】:

  • 你能不能像var date = new Date(Date.parse(myDateString))那样从你的JSON中解析格式化的日期?您列出的第一种格式将正确解析。
  • 我正在解析一组对象,而不是一次性日期字符串
  • 是的,第一个确实解析但我希望它在集合中为: CallDateTime: new Date(2019-11-21T02:29:33.392Z) 这意味着改变它的序列化方式
  • @Hank,我的回答对您解决问题有帮助吗?如果是,请将其标记为已接受。如果没有,请告诉我,我会尽力提供进一步帮助。

标签: javascript c# json datetime json.net


【解决方案1】:

您似乎在某处遗漏了一步,因为从表面上看,您做的一切都是正确的。所以让我在这里概述所需的步骤:

  1. 你有一个属性为DateTime 类型的类,例如PagedZoningCase:

    public class PagedZoningCase
    {
        public DateTime CallDateTime { get; set; }
    }
    
  2. 您有一个PagedZoningCase 类型的对象,并使用代码对其进行序列化:

    var records = new List<PagedZoningCase> { new PagedZoningCase { CallDateTime = DateTime.Now } };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(records);
    
  3. 你会得到一个如下所示的 json:

    "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]"
    
  4. 在客户端,您解析这个 json,并使用 Date 构造函数,因为 JSON does not know anything about dates

    var json = "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]";
    var records = JSON.parse(json);
    var recordsWithDates = records.map(function (r) { 
       r.CallDateTime = new Date(r.CallDateTime); 
       return r;
    });
    

就是这样。你可以验证你有一个 Date 这样的类型(顺便说一句,不要尝试在 StackOverflow 控制台中打印日期,因为它只打印一个字符串):

var json = "[{\"CallDateTime\":\"2019-11-26T14:28:35.5185231+02:00\"}]";
var records = JSON.parse(json);
var recordsWithDates = records.map(function (r) { 
   r.CallDateTime = new Date(r.CallDateTime); 
   return r;
});
// validate CallDateTime is of Date type
console.log(typeof recordsWithDates[0].CallDateTime.getMonth === 'function') 

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2018-08-29
    • 2017-05-31
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多