我们想向正在测试我们的应用程序的用户展示一些JSON.所以我们在ASP.NET代码隐藏文件中调用我们的REST服务并返回一个包含大量JSON的字符串.
然后我们将它放在页面中的PRE元素中,调用beautify来创建可读的JSON并且一切都很好:显示了一些人类可读的内容.
好但是一件事:所有日期都以正常的JSON格式显示,如"/ Date(1319266795390 + 0800)/"
我想要做的是用JSON(C#)字符串中的'普通'日期替换那些JSON日期,所以在后面的代码中,在我将字符串添加到PRE元素之前.
我在考虑一些正则表达式,但我无法弄清楚如何......
Kam*_*eri 13
我一直在处理JSON字符串中的日期已有一段时间了,没有标准的方法,这就是为什么有这么多不同的方法来做到这一点!如果JSON规范可以首先为日期指定标准格式,那可能会更好!
微软正在以自己的方式做到这一点,从1970年开始以UTC格式计算msecs就像这样 "/Date(1319266795390+0800)/"
自从在输出顶部使用正则表达式以来,我们一直在将上述字符串更改为ISO-8601格式ASP.Net JavaScriptSerializer
.这是一个W3C标准,人类可读和大多数浏览器序列化日期到字符串的方式,这里是如何:
static readonly long DATE1970_TICKS = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
static readonly Regex DATE_SERIALIZATION_REGEX = new Regex(@"\\/Date\((?<ticks>-?\d+)\)\\/", RegexOptions.Compiled);
static string ISO8601Serialization(string input)
{
return DATE_SERIALIZATION_REGEX.Replace(input, match =>
{
var ticks = long.Parse(match.Groups["ticks"].Value) * 10000;
return new DateTime(ticks + DATE1970_TICKS).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
});
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松更改格式以满足您的需求,查看自定义日期和时间格式在此处查看MSDN文章
以下是它的使用方法:
JavaScriptSerializer ser = new JavaScriptSerializer();
var JsonSrt = ISO8601Serialization(ser.Serialize(DateTime.Now)); // "\"2012-05-09T14:51:38.333\""
Run Code Online (Sandbox Code Playgroud)
更新:
可以使用Regex将JavaScript中服务器返回的JSON字符串调整为更易读的形式:
var str = "/Date(1319266795390+0800)/";
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) {
return new Date(Number(date)).toString();
});
Run Code Online (Sandbox Code Playgroud)
小智 5
解决方案位于问题中显示的字符串中.JavaScript Date对象将解析该格式并生成可读版本,因此Date(1319266795390+0800)
返回"Wed Apr 18 2012 08:13:22 GMT-0500(Central Daylight Time)".
要从字符串中删除正斜杠,可以将replace函数与正则表达式一起使用:"/Date(1319266795390+0800)/".replace(/\//g, '')
.