DotnetNuke Web Api - JsonConverter没有得到使用

问题描述:

我试图强制在特定属性上使用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

有几种方法可以解决这个问题。两者都不涉及更换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