我正在做一个 ASP.NET WebApi(候选发布)项目,其中我正在使用几个标有[可序列化]属性的DTO。这些 DTO 超出了我的控制范围,因此我无法以任何方式修改它们。当我从 get 方法返回其中任何一个时,生成的 JSON 包含一堆k__BackingFields如下所示:
<Name>k__BackingField=Bobby
<DateCreated>k__BackingField=2012-06-19T12:35:18.6762652-05:00
根据我所做的搜索,这似乎是 JSON 的问题。NET 的 IgnoreSerializableAttribute 设置,为了解决我的问题,我只需要按照文章的建议对其进行全局设置。如何在 ASP.NET Web api 项目中全局更改此设置?
我找到了摆脱名称中k__BackingField的简单方法。
这个片段应该在 Global.asax.cs 的 Application_Start() 中的某个地方:
JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
看起来默认设置可以处理它。
由于该库没有公开DefaultContractResolver
的静态资源库,我建议您在JsonConvert
上创建一个静态包装器,它是 Serialize*/Deserialize* 方法(至少您使用的方法)。
在静态包装器中,您可以定义静态合约解析器:
private static readonly DefaultContractResolver Resolver = new DefaultContractResolver
{
IgnoreSerializableAttribute = true
};
这可以传递给包装器内JsonSerializerSettings
中的每个序列化方法。然后,您在整个项目中调用您的类。
另一种方法是获取 JSON.NET 源代码并自行调整以默认使用该属性。
,以下内容解决了循环引用和k__BackingField
的问题。
在WebApiConfig
将以下内容添加到Register()
方法中:
JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings {
ContractResolver = new DefaultContractResolver {
IgnoreSerializableAttribute = true
},
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
朋友们,不要像这样声明属性:
public String DiscretionCode { get; set; }
但是,创建辅助变量,就像旧的一样....
private String discretionCode;
public String DiscretionCode
{
get { return discretionCode;}
set { discretionCode = value; }
}