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

时间:2015-03-19 01:17:26

标签: c# json serialization json.net

我有一个自定义的ContractResolver,用于序列化选择性属性。在每个客户端请求上,我正在创建一个实例,传递一个布尔值(取决于条件)并将其设置为JsonFormatter的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

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

1 个答案:

答案 0 :(得分:0)

我意识到应用程序正在使用自定义ContentNegotiator,因此重置json格式化程序并不起作用。 ContentNegotiator在Global.asax文件中设置如下。

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));
    }