使用JSON.NET序列化JSON时自定义ContractResolver不工作

问题描述:

我有一个自定义的ContractResolver,它将选择性属性序列化。在每个客户端请求上,我创建了一个传递布尔值的实例(取决于条件),并将其设置为JsonFormatter的ContractResolver。使用JSON.NET序列化JSON时自定义ContractResolver不工作

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DynamicContractResolver(false); 

在调试的时候,protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)方法永远不会被命中。

我不明白为什么新的ContractResolver没有在JsonFormatter中设置。

而且,当我设置新ContractResolver的方法是这样的:

[HttpGet] 
    public CustObj GetInfo(string param) 

我真的不能这样做return Request.CreateResponse(HttpStatusCode.OK, result, formatter);,因为我需要返回CustObj

注意:我正在设置JsonFormatter Global.asax.cs文件。

我意识到该应用程序使用自定义ContentNegotiator,由于重置json格式化程序无法正常工作。 Global.asax文件中的ContentNegotiator设置如下。

GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter)); 

所以,对于在控制器每次请求,我把这种方法基本上替换现有ContentNegotiator

private void SetNewJsonFormatterWithCustomContractResolver(bool returnMVFormat) 
    { 
     //Create a new JsonMediaTypeFormatter 
     var newJsonFormatter = new JsonMediaTypeFormatter(); 
     newJsonFormatter.SerializerSettings = new JsonSerializerSettings() 
     { 
      ContractResolver = new DynamicContractResolver(returnMVFormat) 
     }; 

     GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(newJsonFormatter)); 
    }