我有一个控制器操作,它有效地简单地返回我的模型的 JsonResult。因此,在我的方法中,我有以下内容:
return new JsonResult(myModel);
这很好用,除了一个问题。模型中有一个日期属性,这似乎在 Json 结果中返回,如下所示:
"\/Date(1239018869048)\/"
我应该如何处理日期,以便它们以我需要的格式返回?或者我如何在脚本中处理上面的这种格式?
JSON 规范不考虑日期值。MS 不得不打个电话,他们选择的路径是利用字符串的 javascript 表示中的一个小技巧:字符串文字“/”与“\/”相同,字符串文字 永远不会 被序列化为“ \/”(甚至“\/”也必须映射到“\\/”)。
请参阅http://msdn.microsoft.com/en- us/library/bb299886.aspx#intro_to_json_topic2以获得更好的解释(向下滚动到“从 JavaScript 文字到 JSON”)
JSON 的痛点之一是缺少日期/时间文字。许多人在第一次遇到 JSON 时会感到惊讶和失望。缺少日期/时间文字的简单解释(不管是否安慰)是 JavaScript 也从未有过:JavaScript 中对日期和时间值的支持完全是通过 Date 对象提供的。因此,大多数使用 JSON 作为数据格式的应用程序通常倾向于使用字符串或数字来表示日期和时间值。如果使用字符串,您通常可以期望它采用 ISO 8601 格式。相反,如果使用数字,则该值通常表示自纪元以来的通用协调时间 (UTC) 中的毫秒数,其中纪元定义为 1970 年 1 月 1 日午夜 (UTC)。再次,这只是一个约定,不是 JSON 标准的一部分。如果您正在与另一个应用程序交换数据,则需要查看其文档以了解它如何在 JSON 文字中编码日期和时间值。例如,Microsoft 的 ASP.NET AJAX 不使用上述两种约定。相反,它将 .NET DateTime 值编码为 JSON 字符串,其中字符串的内容是 /Date(ticks)/,其中 ticks 表示自纪元 (UTC) 以来的毫秒数。因此,1989 年 11 月 29 日凌晨 4:55:30,UTC 编码为“\/Date(628318530718)\/”。NET AJAX 不使用上述任何一种约定。相反,它将 .NET DateTime 值编码为 JSON 字符串,其中字符串的内容是 /Date(ticks)/,其中 ticks 表示自纪元 (UTC) 以来的毫秒数。因此,1989 年 11 月 29 日凌晨 4:55:30,UTC 编码为“\/Date(628318530718)\/”。NET AJAX 不使用上述任何一种约定。相反,它将 .NET DateTime 值编码为 JSON 字符串,其中字符串的内容是 /Date(ticks)/,其中 ticks 表示自纪元 (UTC) 以来的毫秒数。因此,1989 年 11 月 29 日凌晨 4:55:30,UTC 编码为“\/Date(628318530718)\/”。
一个解决方案是把它解析出来:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
但是我听说在某处有一个设置可以让序列化程序使用语法输出DateTime对象。new Date(xxx)我会试着把它挖出来。
DateTime
new Date(xxx)
的第二个参数JSON.parse()接受一个reviver函数,其中规定了在返回之前最初是如何产生值的。
JSON.parse()
reviver
这是日期的示例:
var parsed = JSON.parse(data, function(key, value) { if (typeof value === 'string') { var d = /\/Date\((\d*)\)\//.exec(value); return (d) ? new Date(+d[1]) : value; } return value; });
请参阅JSON.parse()的文档