JSON有一个非常大的遗憾,就是对于DateTime类型没有进行相关的标准表示,于是MS为了解决此类问题,在Asp.net Ajax的实现中用\Date(tickets)\来表示日期时间,为了和表示日期时间的和类似于表示日期时间的数据取个开来,在传递的JSON字符串中就是这样表示的,如:
var jsonString='{"name":"James","birthday":"\\\/Date(1034000000000)\\\/"}'
这样传递到客户端是不能处理的,需要预先处理一下,在进行JSON的转换。MS的处理方式是:
jsonString = jsonString.replace(new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)\\)\\\\/\\"', 'g'), "$1new Date($2)");
这样就把:
{
"name":"James",
"birthday":"\/Date(1034000000000)\/"
}
转化成了:
{
"name":"James",
"birthday": new Date(1034000000000)
}
然后再:
obj = eval('('+jsonString+')');
OK,这样就能解析JavaScript的日期时间了。
相关的测试代码如下:
<html>
<head>
<script language="javascript">
var jsonString='{"name":"James","birthday":"\\\/Date(1034000000000)\\\/"}'
jsonString = jsonString.replace(new RegExp('(^|[^\\\\])\\"\\\\/Date\\((-?[0-9]+)\\)\\\\/\\"', 'g'), "$1new Date($2)");
alert(jsonString);
obj = eval('('+jsonString+')');
alert(obj.name);
alert(obj.birthday.toLocaleDateString()+' '+obj.birthday.toLocaleTimeString());
</script>
</head>
<body>
</body>
</html>
也可以下载附件测试
附:
ASP.NEXT 中的 AJAX JSON 序列化程序将 DateTime 实例编码为 JSON 字符串。在预发布周期中,ASP.NET AJAX 使用格式“
@ticks@”,其中 ticks 表示从通用协调时间 (UTC) 1970 年 1 月 1 日起经过的毫秒数。以 UTC 表示的日期和时间(如 1989 年 11 月 29 日 4:55:30 AM)会编码为“
@62831853071@”。虽然简单易懂,但此格式无法区分序列化的日期和时间值与看起来像序列化日期但又不需要进行反序列化的值。因此,ASP.NET AJAX 团队对最终版本进行了更改,通过采用“\/Date(ticks)\/”格式解决了这一问题。
新格式借助一个小技巧减少了误解的可能性。在 JSON 中,字符串中的正斜杠 (/) 字符可以用反斜杠 (\)进行转义(即使没有对此进行严格要求)。ASP.NET AJAX 团队利用这点修改了 JavaScriptSerializer,将DateTime 实例编写为字符串“
\/Date(ticks)\/”。两个正斜杠的转义只是表面的,但对 JavaScriptSerializer 至关重要。按照 JSON 规则,“
\/Date(ticks)\/” 在技术上相当于 “
/Date(ticks)/”,但 JavaScriptSerializer 会将前者反序列化为 DateTime,将后者反序列化为 String。因此与预发布版本的“
@ticks@”格式相比,混淆的可能性会大大减少。
注:此段文字来源于MSDN文章《
JavaScript 和 .NET 中的 JavaScript Object Notation (JSON) 简介》