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