4

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

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

那么是否可以在 Web.config 中设置某些内容并让 JSON 序列化程序将每个日期都视为 UTC?

4

1 回答 1

3

该死,似乎最近我注定要在 StackOverflow 上回答我自己的问题。咳咳,解决方法如下:

  1. 使用 NuGet 安装 ServiceStack.Text - 您将免费获得更快的 JSON 序列化(不客气)
  2. 安装 ServiceStack.Text 后,只需覆盖基本控制器中的 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));
            }
        }
    }  
    
  3. 默认情况下,这个序列化程序似乎做了“正确的事情”——如果它们的 DateTime.Kind 未指定,它不会与你的 DateTime 对象混淆。然而,我在 Global.asax 中做了一些额外的配置调整(在你开始使用库之前知道如何做是很好的):

    protected void Application_Start()
    {
        JsConfig.DateHandler = JsonDateHandler.ISO8601;
        JsConfig.TreatEnumAsInteger = true;
    
        // rest of the method...
    }
    

这个链接有帮助

于 2013-02-20T06:46:13.993 回答