ASP.NET MVC Json DateTime Serialization conversion to UTC

后端 未结 1 1734
说谎
说谎 2020-12-17 03:52

Using Json() method on ASP.NET MVC Controller is giving me trouble - every DateTime thrown in this method is converted to UTC using server time.

Now, is there an eas

相关标签:
1条回答
  • 2020-12-17 04:55

    Dammit, it seems that lately I'm destined to answer my own questions here at StackOverflow. Sigh, here is the solution:

    1. Install ServiceStack.Text using NuGet - you'll get faster JSON serialization for free (you're welcome)
    2. Once ServiceStack.Text is installed, just override Json method in your base Controller (you do have one, right?):

      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. It seems that this serializer by default does "the right thing" - it doesn't mess with your DateTime objects if their DateTime.Kind is Unspecified. However, I did few additional config tweaks in Global.asax (and it's good to know how to do that before you start using library):

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

    This link helped

    0 讨论(0)
提交回复
热议问题