mvc系列之json时间格式化问题解决
使用mvc自带的Json方法返回json数据的时候,总会遇到一个令人懊恼的问题,这个方法总会把时间格式化为下面这种形式
{"success":true,"time":"\/Date(1454156061075)\/"}
这不是我们所需要的,下面分享一个自定义JsonResult类,通过这个类可以解决这个令人懊恼的问题。
首先,继承JsonResult类,重写其ExecuteResult方法,在该方法里面实现时间格式的转换
public class ToJsonResult : JsonResult { const string error = "该请求已被封锁,因为敏感信息透露给第三方网站,这是一个GET请求时使用的。为了可以GET请求,请设置JsonRequestBehavior AllowGet。"; /// <summary> /// 格式化字符串 /// </summary> public string FormatString { get; set; } public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException(error); } 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(); string jsonstring = serializer.Serialize(Data); string p = @"\\/Date\(\d+\)\\/"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); Regex reg = new Regex(p); jsonstring = reg.Replace(jsonstring, matchEvaluator); response.Write(jsonstring); } } /// <summary> /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串 /// </summary> private string ConvertJsonDateToDateString(Match m) { string result = string.Empty; string p = @"\d"; var cArray = m.Value.ToCharArray(); StringBuilder sb = new StringBuilder(); Regex reg = new Regex(p); for (int i = 0; i < cArray.Length; i++) { if (reg.IsMatch(cArray[i].ToString())) { sb.Append(cArray[i]); } } DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(sb.ToString())); dt = dt.ToLocalTime(); result = dt.ToString(FormatString); return result; } }
然后,在自己的Action里面返回该类的一个对象即可:
public class JsonController : Controller { // // GET: /Json/ public ActionResult Index() { var result = new { success = true, time = DateTime.Now }; return new ToJsonResult() { FormatString = "yyyy/MM/dd",JsonRequestBehavior=JsonRequestBehavior.AllowGet,Data=result }; } }
可以看到,返回的json数据终于正常了~
{"success":true,"time":"2016/01/30"}
不过这里面有些郁闷的是,这种写法不够优美,下面定义一个扩展类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Mvc; using BigFileDownLoad.Controllers; namespace My.MvcExtends { public static class MvcExtendsion { public static JsonResult MyJson(this Controller controller, object data, JsonRequestBehavior behavior, string format) { return new ToJsonResult { Data = data, JsonRequestBehavior = behavior, FormatString = format }; } } }
然后在controller里面引用命名空间:
using My.MvcExtends;
public class JsonController : Controller { // // GET: /Json/ public ActionResult Index() { var result = new { success = true, time = DateTime.Now }; return this.MyJson(result,JsonRequestBehavior.AllowGet,"yyyy/MM/dd"); } }
这样就可以用很优雅的方式实现json数据的时间格式化了~

浙公网安备 33010602011771号