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”不起作用。
答
有几种方法可以解决这个问题。两者都不涉及更换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();
这是对一个类中的特定财产或特定财产(同一个名字)在多个类上? – 2014-11-03 15:00:26
这是针对单个课程的特定属性。 – IronBark 2014-11-03 15:03:11