在不使用属性的情况下将 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 所以我不清楚:
- 我的合同解析器应该使用什么基础 class?我怀疑它应该是
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 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.)
我想在不使用 [JsonConverter(typeof(...))]
属性的情况下将 JsonConverter 分配给 class(因为我正在使用 Web API 做一些复杂的事情,这需要我分配 JsonConverter在与定义 class 的程序集不同的程序集中)。
Globally use a JsonConverter on a class without the attribute几乎的答案回答了我的问题。但是我的问题是关于 Web API 所以我不清楚:
- 我的合同解析器应该使用什么基础 class?我怀疑它应该是
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 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.)