我想在不使用[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的问题。)