2014-11-03 85 views
1

我試圖強制在特定屬性上使用IsoDateTimeConverter。DotnetNuke Web Api - JsonConverter沒有得到使用

我註冊的路線和內容談判:對物業使用

public class RouteMapper : IServiceRouteMapper 
    { 

     public void RegisterRoutes(IMapRoute mapRouteManager) 
     { 
      mapRouteManager.MapHttpRoute("SbApi", "default", "{controller}/{action}", new[] { "SbApi.Controllers" }); 

      GlobalConfiguration.Configuration.Services.Replace(typeof(System.Net.Http.Formatting.IContentNegotiator), new JsonContentNegotiator()); 
     } 
    } 


public class JsonContentNegotiator : IContentNegotiator 
    { 
     public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters) 
     { 
      var formatter = new JsonMediaTypeFormatter(); 
      formatter.UseDataContractJsonSerializer = false; 
      var isoDateConverter = formatter.SerializerSettings.Converters 
       .OfType<IsoDateTimeConverter>() 
       .FirstOrDefault(); 

      if(isoDateConverter!=null){ 
       formatter.SerializerSettings.Converters.Remove(isoDateConverter); 
      } 

      formatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "dd-MM-yyyy" }); // custom date format, to see if the converter is used 

      var result = new ContentNegotiationResult(formatter, new MediaTypeHeaderValue("application/json")); 
      return result; 
     } 
    } 

屬性:

[JsonConverter(typeof(IsoDateTimeConverter))] 
     public System.DateTime EndDate { get; set; } 

串行器的輸出:

"EndDate":"2016-01-01T00:00:00" 

如何使它使用IsoDateTimeConverter?

編輯:

我使用自定義IContentNetogiator來實施對XML的使用JSON的。

我只使用自定義日期時間格式來查看轉換是否實際使用。

我真正需要的是ISO格式(具有完整時區),但由於某種原因,我無法執行它。我試圖在CustomDate中設置它,但無濟於事。

public CustomDatetimeConverter() 
     { 
      base.DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; // none of these work.. 
      base.DateTimeFormat = "o"; 

      base.Culture = System.Globalization.CultureInfo.InvariantCulture; 
      base.DateTimeStyles = System.Globalization.DateTimeStyles.AssumeLocal; 
     } 

編輯2: 無論如何,我得到它的工作排序。由於沒有任何工作,我不需要毫秒的時間,我結束使用以下格式:「yyyy」 - 'MM' - 'dd'T'HH':'mm':'ss.000000zzz「。 「zzz」用於代替「K」,由於某些原因,該「K」不起作用。

+0

這是對一個類中的特定財產或特定財產(同一個名字)在多個類上? – 2014-11-03 15:00:26

+0

這是針對單個課程的特定屬性。 – IronBark 2014-11-03 15:03:11

回答

2

有幾種方法可以解決這個問題。兩者都不涉及更換IContentNegotiator。第一個(也是最容易的)方法是創建具有自定義日期格式IsoDateTimeConverter的子類:

class CustomDateTimeConverter : IsoDateTimeConverter 
{ 
    public CustomDateTimeConverter() 
    { 
     base.DateTimeFormat = "dd-MM-yyyy"; 
    } 
} 

然後改變[JsonConverter]屬性您EndDate屬性:

[JsonConverter(typeof(CustomDateTimeConverter))] 
public System.DateTime EndDate { get; set; } 

另一種方式做同樣的事情是創建一個自定義IContractResolver,它將以編程方式將IsoDateTimeConverter應用於目標屬性。以下是您需要解析器的代碼。將Your_Class替換爲包含EndDate屬性的類的名稱。

class CustomResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, 
         Newtonsoft.Json.MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> props = base.CreateProperties(type, memberSerialization); 
     if (type == typeof(Your_Class)) 
     { 
      JsonProperty prop = 
       props.Where(p => p.PropertyName == "EndDate") 
        .FirstOrDefault(); 

      if (prop != null) 
      { 
       prop.Converter = 
        new IsoDateTimeConverter { DateTimeFormat = "dd-MM-yyyy" }; 
      } 
     } 
     return props; 
    } 
} 

要在項目中安裝這個解析器,如下行添加到Register方法您WebApiConfig類:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
                   new CustomResolver(); 
+0

謝謝,那幫了我。我使用了一個自定義IContentNetogiator來強制使用JSON over XML。 – IronBark 2014-11-04 12:32:50

+0

請參閱編輯的問題。 – IronBark 2014-11-04 12:44:56