在Json.net中全局设置IgnoreSerializableAttribute

时间:2012-06-20 18:03:06

标签: json.net asp.net-web-api

我正在开发一个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项目中全局更改此设置?

3 个答案:

答案 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; }
}