我在ASP.Net中有一个WebAPI 2.0项目,在其中实现了自定义的DefaultContractResolver,以便可以控制如何使用JSON.Net将实体序列化为JSON。但是我不确定如何告诉框架使用我的自定义实现。我还想知道是否有可能针对特定的控制器/操作更改ContractResolver。
谢谢!
-编辑03/07/2014
我已经通过创建一个新的ConfigSettings对象并手动解析该对象来弄清楚如何使用我的自定义实现。但是,生成的JSON被序列化了两次(它具有额外的\ r \ n字符)。这是因为默认情况下,webAPI控制器会序列化响应,所以我想更改以覆盖该行为...这是正确的方法吗?
最佳答案
我只是费尽心思弄清楚自己,而我需要一个可以按要求工作的人。您可以使用该方法,只返回相同的媒体格式化程序。我发现在GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver
上设置格式化程序对于按请求的需求有点不可靠,即使我尝试在该类的单个实例中处理按请求的需求也是如此。但是,您可以尝试在App_Start代码中的某个位置设置ContractResolver实例。
我最终创建了一个自定义JsonMediaTypeFormatter
,用于检查请求是否配置了ContractResolver,您可以只返回一个和相同的解析器:
public class DynamicJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, System.Net.Http.Headers.MediaTypeHeaderValue mediaType)
{
// shown is getting the current formatter, but you can return an instance you prefer
var formatter = base.GetPerRequestFormatterInstance(type, request, mediaType) as JsonMediaTypeFormatter;
// Here I had more code to get the resolver based on request, skipped
((JsonMediaTypeFormatter)formatter).SerializerSettings.ContractResolver = <YourContractResolverInstance>;
return formatter;
}
}
我想您已经知道了这部分内容,但是您的合同解析器可以覆盖`CreateProperties'并让您自己的逻辑来决定将显示哪些json属性以及它们将使用哪些名称(为完整性和其他读者的利益而添加):
public class DynamicContractResolver : DefaultContractResolver
{
...
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization){
...
}