Преобразование сериализации ASP.NET MVC Json DateTime в UTC

Использование метода Json() в ASP.NET MVC Controller дает мне проблемы - каждый DateTime, созданный в этом методе, преобразуется в UTC с использованием времени сервера.

Теперь, есть ли простой способ сказать ASP.NET MVC Json Serializer остановить автоматическое преобразование DateTime в UTC? Как отмечено на этом вопросе, перепрограммирование каждой из ваших переменных с помощью DateTime.SpecifyKind(date, DateTimeKind.Utc) делает трюк, но, очевидно, я не могу сделать это вручную на каждую переменную DateTime.

Так можно ли установить что-то в Web.config и использовать JSON-сериализатор для КАЖДОЙ даты, как если бы он был UTC?

Ответ 1

Черт, похоже, что в последнее время мне суждено ответить на мои собственные вопросы здесь, в StackOverflow. Вздох, вот решение:

  • Установите ServiceStack.Text с помощью NuGet - вы получите более быструю сериализацию JSON бесплатно (пожалуйста)
  • Как только 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));
            }
        }
    }  
    
  • Кажется, что этот сериализатор по умолчанию делает "правильную вещь" - он не путается с вашими объектами DateTime, если их DateTime.Kind не указан. Тем не менее, я сделал несколько дополнительных настроек настроек в Global.asax(и хорошо знать, как это сделать, прежде чем вы начнете использовать библиотеку):

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

Эта ссылка помогла