"无法将'System.Net.Http.Formatting.JsonContractResolver'类型的对象强制转换为'Newtonsoft.Json.Serialization.DefaultContractResolver'."

Sch*_*zIT 12 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;
     }
Run Code Online (Sandbox Code Playgroud)

我相信这段代码是因为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);
Run Code Online (Sandbox Code Playgroud)

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

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

            var contractResolver =
          (IContractResolver)serializerSettings.ContractResolver;
Run Code Online (Sandbox Code Playgroud)

但是,这会在API中返回以下错误:

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

Oua*_*rzy 5

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

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

你还需要吗?

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

希望能帮助到你


Sch*_*zIT 2

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