ASP.NET MVC JsonResult日期格式
我有一个控制器动作,有效地简单地返回我的模型的JsonResult。 所以,在我的方法中,我有如下内容:
return new JsonResult(myModel);
除了一个问题,这很有效。 模型中有一个日期属性,这似乎是在Json结果中返回的,如下所示:
"/Date(1239018869048)/"
我应该如何处理日期,以便以我需要的格式返回? 或者我如何在脚本中处理上述格式?
只是为了扩大casperOne的答案。
JSON规范不考虑日期值。 MS不得不进行调用,他们选择的路径是利用字符串的JavaScript表示中的一个小窍门:字符串文字“/”与“ /”相同,并且字符串文字永远不会被序列化为“ /“(偶数” /“必须映射到” /“)。
请参阅http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2以获得更好的解释(向下滚动到“从JavaScript Literals到JSON”)
JSON的缺点之一是缺少日期/时间文字。 很多人在第一次遇到JSON时感到惊讶和失望。 没有日期/时间文字的简单解释(安慰或不安慰)是JavaScript从未有过:JavaScript中对日期和时间值的支持完全通过Date对象提供。 因此,大多数使用JSON作为数据格式的应用程序通常倾向于使用字符串或数字来表示日期和时间值。 如果使用字符串,通常可以期望它是ISO 8601格式。 如果使用的是数字,那么该数值通常意味着自世纪时起的世界协调时间(UTC)中的毫秒数,其中时期定义为1970年1月1日午夜(UTC)。 再次,这仅仅是一个约定,不属于JSON标准的一部分。 如果您正在与另一个应用程序交换数据,则需要检查其文档以了解它如何在JSON文本中对日期和时间值进行编码。 例如,微软的ASP.NET AJAX既不使用所描述的约定。 相反,它将.NET DateTime值编码为JSON字符串,其中字符串的内容是/ Date(ticks)/,并且其中tick表示自epoch(UTC)以来的毫秒数。 因此,1989年11月29日上午4:55:30在UTC中编码为“ / Date(628318530718) /”。
解决办法是解析它:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
但是我听说有一个设置让序列化程序用new Date(xxx)
语法输出DateTime
对象。 我会尽力挖掘出来。
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()的文档
这里是我在Javascript中的解决方案 - 非常像JPot的,但更短(可能快一点):
value = new Date(parseInt(value.substr(6)));
“value.substr(6)”取出“/ Date(”部分,而parseInt函数忽略了最后出现的非数字字符。
编辑:我故意省略基数(第二个参数parseInt); 看到我下面的评论。 此外,请注意,ISO-8601日期优于此旧格式 - 因此此格式通常不应用于新开发。 查看卓越的Json.NET库,以获得使用ISO-8601格式序列化日期的绝佳选择。
对于ISO-8601格式化的JSON日期,只需将该字符串传递给Date构造函数:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
处理它的客户端有相当多的答案,但是如果你愿意,你可以改变输出服务器端。
有几种方法可以解决这个问题,我将从基础开始。 您必须继承JsonResult类并重写ExecuteResult方法。 从那里你可以采取几种不同的方法来改变序列化。
方法1:默认实现使用JsonScriptSerializer。 如果您查看文档,可以使用RegisterConverters方法添加自定义JavaScriptConverters。 这有一些问题:JavaScriptConverter序列化为字典,即它需要一个对象并序列化为一个Json字典。 为了使对象序列化为一个字符串,它需要一些hackery,请参阅post。 这个特殊的黑客也会逃离字符串。
public class CustomJsonResult : JsonResult
{
private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
if (!String.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
// Use your custom JavaScriptConverter subclass here.
serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });
response.Write(serializer.Serialize(Data));
}
}
}
方法2(推荐):第二种方法是从重写的JsonResult开始,并使用另一个Json序列化程序,在我的情况下是Json.NET序列化程序。 这不需要方法1的诡计。下面是我对JsonResult子类的实现:
public class CustomJsonResult : JsonResult
{
private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
if (!String.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
// Using Json.NET serializer
var isoConvert = new IsoDateTimeConverter();
isoConvert.DateTimeFormat = _dateFormat;
response.Write(JsonConvert.SerializeObject(Data, isoConvert));
}
}
}
用法示例:
[HttpGet]
public ActionResult Index() {
return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}
额外的学分:詹姆斯牛顿 - 金
链接地址: http://www.djcxy.com/p/8429.html上一篇: ASP.NET MVC JsonResult Date Format
下一篇: How do you handle multiple submit buttons in ASP.NET MVC Framework?