JsonMediaTypeFormatter 格式化 k__backingfield

JsonMediaTypeFormatter formatting with k__backingfield

我遇到了 JsonMediaTypeFormatter 的问题,据我所知,这是最近才开始发生的。

在某些时候,我拥有的对象(一个普通的旧 poco)开始序列化完整作为支持字段。我正在使用自动属性(同样只是一个 poco),但出于某种原因 JsonMediaTypeFormatter 的输出是 k__backingfield<propname>:"value"

在过去的几周里,我们已经升级到 visual studio 2015(虽然我怀疑这是问题的根本原因,因为这已经工作了几周了)。

我已经清除了所有形式的 nuget 缓存,删除了所有 bin/obj 目录....卸载并重新安装了 visual studio 2015 专业版...修复了 visual studio 2015 专业版... . 这段代码已经有一段时间没有改变了。

我们正在使用 System.Net.Http.Formatting5.2.0 版本。

感谢您的帮助。

只是一个快速更新....这不会发生在其他任何人的机器上。我没有遇到任何错误(我注意到)。我还要为此添加一些 visual studio 2015 年相关标签

好的,另一个快速更新。我已将 LinqPad 脚本以及 运行 该脚本所需的程序集发送给同事。我发送的程序集正是我从 nuget 中提取并在我的机器上编译的程序集。当他 运行 编写代码时,它会根据需要进行序列化。我的机器(现在是另一位同事的机器)仍然遇到这个问题。

我将继续尽可能地隔离此问题,但我们将不胜感激任何进一步的指导

我可以通过将 JsonMediaTypeFormatter.UseDataContractJsonSerializer 属性 更改为 true 来解决这个问题。我正在做更多的研究,以了解为什么这有效以及为什么我想要或不想这样做......早上我将不得不 运行 与没有这个的同事进行更多测试问题。我不喜欢通过更改代码来修复某些行为不可预测的东西的想法。

好的!再来一个更新。到目前为止,受影响的机器最近安装了 Active Reports 10。我们正在执行更多测试,并将在当前未受影响的机器上安装 Active Reports 10,以查看它是否确实是罪魁祸首。为活动报告添加标签。如果这是真的,我会向他们提出一个错误。

您的 POCO 是否标有 [Serializable] 属性?如果是这样,这可能是问题的原因。

Web API 显然附带了 Json.Net DefaultContractResolver 配置 IgnoreSerializableAttribute = false。此设置的影响之一是自动属性的名称将以 <PropertyName>k__BackingField 格式序列化,其中 PropertyName 替换为 属性.

的实际名称

要解决此问题,您可以从 类 中删除 [Serializable] 属性,或者用具有 IgnoreSerializableAttribute = true 的新解析器替换开箱即用的解析器.要执行后者,请将以下内容添加到 Global.asax:

中的 Application_Start 方法
var resolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
resolver.IgnoreSerializableAttribute = true;
var config = GlobalConfiguration.Configuration;    
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = resolver;

这是一个演示概念的 fiddle(虽然它是一个控制台应用程序,而不是 Web API):https://dotnetfiddle.net/Bu6lgy

好的。安装 Active Reports 10 会将 Newtonsoft.Json 添加到 GAC。从 GAC 中删除该程序集已解决此问题。我将发布带有活动报告的错误。