"无法转换类型为#System; Net.Net.Http.Formatting.JsonContractResolver'的对象输入' Newtonsoft.Json.Serialization.DefaultContractResolver'。"

时间:2016-09-01 10:38:27

标签: c# json.net

我们有一个最近被移动到新服务器的WEB API项目。在对其项目进行一些补充之后,我正在运行我的项目。有效载荷,但它突然抛出以下错误:

  

无法投射类型的对象   ' System.Net.Http.Formatting.JsonContractResolver'输入   ' Newtonsoft.Json.Serialization.DefaultContractResolver'

令人讨厌的代码行在global.asax:

  protected void Application_Start() {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        var serializerSettings =
         GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        var contractResolver =
           (DefaultContractResolver)serializerSettings.ContractResolver;
           contractResolver.IgnoreSerializableAttribute = true;
     }

我相信这段代码是因为API的默认输出是XML而添加的,我们需要它是JSON。

突出显示(DefaultContractResolver)会显示一个工具提示,表明它引用NewtonSoft.JSon.Serialization.DefaultContractResolver。突出显示serializersettings.ContractResolver引用IContractResolver JSonSerializerSettings.ContractResolver

代码已经在这台机器上存在了一段时间,我认为我唯一能改变的是安装更新版本的.NET。

什么可能导致这行代码突然抛出错误?我该如何解决?

谢谢!

编辑:根据评论中的请求,我的序列化代码包含以下内容:

json += "{\"employeename\": \"" + Convert.ToString(reader["Employee"])
+ "\"},";

return JsonConvert.DeserializeObject<OrgChartModel>(json);

Edit2:我们现在正在运行.NET 4.5。据我所知,我们之前跑过4.2,但看到它已经过了几个月,我无法确定。

根据Dominick的评论,我尝试将强制转换为DefaultContractResolver更改为:

            var contractResolver =
          (IContractResolver)serializerSettings.ContractResolver;

然而,这会在API中返回以下错误:

{"Message":"The requested resource does not support http method 'GET'."}

2 个答案:

答案 0 :(得分:5)

我从这段代码中了解到,您只是尝试将解析器的IgnoreSerializableAttribute设置为true。

1&GT;你知道为什么要这么做吗?如果你删除它有什么影响? 我可以从Newton Doc看到将IgnoreSerializableAttribute设置为true将阻止Newtonsoft.Json表现得像Microsoft的序列化器,而只是序列化公共属性。

你还需要吗?

2 - ;你当前的SerializerSettings的类型是什么(我们只知道它不是默认的,所以你可能在某处更改它?)你确定它默认仍然有IgnoreSerializableAttribute为false吗?如果是这样,您可能有办法使用实际类型来获取此属性?

希望有所帮助

答案 1 :(得分:2)

我设法通过使用更新版本的JSON.NET解决了这个问题(8,在我们使用版本6之前)。这解决了错误。