Newtonsoft.Json en .NET içerinde artık standart Json kütüphanesi sayılabilir.

Çoğu zaman Json ile AJAX işlemleri yürüttüğümüzde tarih formatları başımızı ağrıtır. Bunun farklı kültürleri var, UTC’si haticesi uzayıp gider.

Mantıklı ve uygulaması kolay olan iki ayaklı bir çözümüm var :

  • Sunucudan veri okurken her zaman UTC olarak veri çek, formatlama işini JavaScript halletsin.
  • Sunucuya veri yollamadan önce uygulama çapında DateTime girişi yapacak tüm kontroller standart bir format kullansın (örn : ‘dd-mm-yyyy’)

Sunucu ile yapılacak bilgi alışverişini serileştirecek custom sınıf:

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace MyWebApplication.Converters
{
    public class CustomDateTimeConvertor : DateTimeConverterBase
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(((DateTime) value).ToUniversalTime());
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            var dateStr = reader.Value.ToString();
            var parts = dateStr.Split('/');
            return new DateTime(Convert.ToInt32(parts[2]), Convert.ToInt32(parts[1]), Convert.ToInt32(parts[0]));
        }
    }
}

Geriye artık web uygulamamızın Json’a veya Json’dan veri dönüşümlerinde bu sınıfı kullanabilmeleri için uygulamamıza sınıfı tanıtmak kalıyor.

public static void Register(HttpConfiguration config)
{
  // Web API configuration and services

  // Web API routes
  config.MapHttpAttributeRoutes();

  config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
    );

    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new CustomDateTimeConvertor()); // <-- Burada
    config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
  }