在不使用属性

时间:2015-10-27 13:59:02

标签: .net asp.net-web-api json.net asp.net-web-api2

我想在没有使用[JsonConverter(typeof(...))]属性的情况下将JsonConverter分配给一个类(因为我正在使用Web API做一些复杂的事情,这需要我在不同的程序集中分配JsonConverter而不是类定义)。

Globally use a JsonConverter on a class without the attribute 的回答几乎回答了我的问题。但是我的问题是关于Web API,所以我不清楚:

  • 我的合约解析员应该使用哪个基类?我怀疑它应该是JsonContractResolver但不确定将MediaTypeFormatter对象传递给它的构造函数。
  • 在Web API中声明自定义合约解析程序的正确方法是什么?

以下代码是我尝试过的,但不起作用。我的自定义合约解析程序未被使用,CreateObjectContract()中的断点不会被击中。

的Global.asax.cs

protected void Application_Start()
{
    GlobalConfiguration.Configuration.Formatters.JsonFormatter
        .SerializerSettings.ContractResolver =
            new CustomResolver(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
    ...
}

CustomResolver.cs

public class CustomResolver : JsonContractResolver
{
    public CustomResolver(MediaTypeFormatter formatter) : base(formatter) { }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (typeof(MyBaseClass).IsAssignableFrom(objectType))
            contract.Converter = new MyBaseClassJsonConverter();

        return contract;
    }
}

1 个答案:

答案 0 :(得分:1)

我在没有使用自定义合约解析器的情况下解决了这个问题,只需将我的JsonConverter类添加到WebApiConfig.cs中的JsonSerializerSettings.Converters集合中:

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyBaseClassJsonConverter());

您也可以在Global.asax.cs中注册:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyBaseClassJsonConverter());

(这个问题被标记为另一个类似问题的副本。但是我仍然会发布一个答案,因为另一个问题仅针对一个特定的JsonConverter而且接受的答案并不清楚如何解决Web API的问题。)