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数据的时间格式化了~

  


 

posted @ 2016-01-30 20:22  尋找一個證明  阅读(821)  评论(0)    收藏  举报