一尘不染

ASP.NET MVC Json DateTime序列化转换为UTC

json

在ASP.NET MVC Controller上使用Json()方法给我带来了麻烦-使用服务器时间,将此方法中引发的每个DateTime都转换为UTC。

现在,有没有一种简单的方法可以告诉ASP.NET MVC
Json序列化器停止将DateTime自动转换为UTC?正如在此问题上所指出的那样,使用DateTime.SpecifyKind(date,DateTimeKind.Utc)重新分配每个变量都可以解决问题,但是显然我不能在每个DateTime变量上手动进行此操作。

那么是否可以在Web.config中进行设置,并使JSON序列化程序将每个日期都视为UTC时间?


阅读 300

收藏
2020-07-27

共1个答案

一尘不染

该死,看来我最近注定要在StackOverflow上回答我自己的问题。igh,这是解决方案:

  1. 使用NuGet安装ServiceStack.Text-您将免费获得更快的JSON序列化(不客气)
  2. 安装ServiceStack.Text之后,只需在基本Controller中重写Json方法(您确实有一个,对吗?):
        protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
    {
        return new ServiceStackJsonResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding
        };
    }

    public class ServiceStackJsonResult : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }

            if (Data != null)
            {
                response.Write(JsonSerializer.SerializeToString(Data));
            }
        }
    }  
  1. 似乎默认情况下,此序列化程序执行“正确的操作”-如果未指定DateTime.Kind对象,则不会与您的DateTime对象混淆。但是,我在Global.asax中做了一些其他的配置调整(最好在开始使用库之前就知道该怎么做):
        protected void Application_Start()
    {
        JsConfig.DateHandler = JsonDateHandler.ISO8601;
        JsConfig.TreatEnumAsInteger = true;

        // rest of the method...
    }

该链接帮助

2020-07-27