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



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

在没有属性的类上全局使用JsonConverter的答案几乎回答了我的问题。然而,我的问题是关于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;
    }
}

我只需将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的问题。)

相关内容

  • 没有找到相关文章

最新更新