DotnetNukeWebApi-JsonConverter没有被使用

本文关键字:DotnetNukeWebApi-JsonConverter | 更新日期: 2023-09-27 18:28:57

我正试图在特定属性上强制使用IsoDateTimeConverter。

我注册路线和内容谈判代表:

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来强制使用JSON而不是XML。

我使用了自定义日期时间格式,只是想看看转换后的数据是否真的被使用了。

我真正需要的是一个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'HH':'m':'ss.000000zzz"。"zzz"被用来代替"K",由于某种原因,"K"不起作用。

DotnetNukeWebApi-JsonConverter没有被使用

有几种方法可以解决这个问题。两者都不涉及更换IContentNegotiator。第一种(也是最简单的)方法是创建具有自定义日期格式的IsoDateTimeConverter的子类:

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

然后更改EndDate属性上的[JsonConverter]属性:

[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;
    }
}

要在项目中安装此解析器,请在WebApiConfig类的Register方法中添加以下行:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = 
                                                                new CustomResolver();
相关文章:
  • 没有找到相关文章