在不使用属性的情况下将 JsonConverter 分配给 class

Assign JsonConverter to class without using an attribute

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

Globally use a JsonConverter on a class without the attribute几乎的答案回答了我的问题。但是我的问题是关于 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;
    }
}

我在不使用自定义合同解析器的情况下解决了这个问题,只需将我的 JsonConverter class 添加到 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.)