ASP.NET Web API - 将日期序列化为 JSON - 无法让示例正常工作



对于不熟悉Web API并将日期序列化为JSON的人来说,这就是我要做的。

不过这对我不起作用,我的日期仍然被序列化为"/Date(1039330800000-0700)/"。

这是我的 JsonNetFormatter:

public class JsonNetFormatter : MediaTypeFormatter
{
    private JsonSerializerSettings _jsonSerializerSettings;
    public JsonNetFormatter(JsonSerializerSettings jsonSerializerSettings)
    {
        _jsonSerializerSettings = jsonSerializerSettings ?? new JsonSerializerSettings();
        // Fill out the mediatype and encoding we support 
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
        Encoding = new UTF8Encoding(false, true);
    }
    protected override bool CanReadType(Type type)
    {
        if (type == typeof(IKeyValueModel))
        {
            return false;
        }
        return true;
    }
    protected override bool CanWriteType(Type type)
    {
        return true;
    }
    protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
    {
        // Create a serializer 
        JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);
        // Create task reading the content 
        return Task.Factory.StartNew(() =>
        {
            using (StreamReader streamReader = new StreamReader(stream, Encoding))
            {
                using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
                {
                    return serializer.Deserialize(jsonTextReader, type);
                }
            }
        });
    }
    protected override Task OnWriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext, TransportContext transportContext)
    {
        // Create a serializer 
        JsonSerializer serializer = JsonSerializer.Create(_jsonSerializerSettings);
        // Create task writing the serialized content 
        return Task.Factory.StartNew(() =>
        {
            using (JsonTextWriter jsonTextWriter = new JsonTextWriter(new StreamWriter(stream, Encoding)) { CloseOutput = false })
            {
                serializer.Serialize(jsonTextWriter, value);
                jsonTextWriter.Flush();
            }
        });

    }
}

和我的 Global.asax.cs 文件:

public class WebApiApplication : System.Web.HttpApplication
{
    private static Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new WebApiApplication.Filters.ExceptionHandlingAttribute());
    }
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    protected void Application_Start()
    {
        RegisterDependencies();
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
        JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
        serializerSettings.Converters.Add(new IsoDateTimeConverter());
        GlobalConfiguration.Configuration.Formatters.Add(new JsonNetFormatter(serializerSettings));
        BundleTable.Bundles.RegisterTemplateBundles();
    }
    private void RegisterDependencies()
    {
        IUnityContainer container = new UnityContainer();
        container.RegisterInstance<IClientRepository>(new ClientRepository());
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
            t =>
            {
                try
                {
                    return container.Resolve(t);
                }
                catch (ResolutionFailedException)
                {
                    return null;
                }
            },
            t =>
            {
                try
                {
                    return container.ResolveAll(t);
                }
                catch (ResolutionFailedException)
                {
                    return new List<object>();
                }
            });
    }
    /// <summary>
    /// Catches all exceptions.
    /// </summary>
    protected void Application_Error()
    {
        var exception = Server.GetLastError();
        Logger.Debug(exception);
    }
}

从我所读到的内容来看,这对很多人都有效。我不确定我错过了什么?

您是否删除了默认添加到配置中的"旧"json格式化程序?认为默认格式化程序而不是您的格式化程序有效。在添加您的 Json 格式化程序之前,请尝试删除默认的 Json 格式化程序

相关内容

  • 没有找到相关文章

最新更新