0

对于不熟悉 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);
    }
}

根据我的阅读,这对很多人都有效。我不确定我错过了什么?

4

1 回答 1

0

您是否删除了默认添加到配置中的“旧”json 格式化程序?认为默认格式化程序可以代替您的格式化程序。在添加之前尝试删除默认的 Json 格式化程序

于 2012-06-20T17:54:59.767 回答