在 Json.net 中全局设置 IgnoreSerializableAttribute



我正在做一个 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; }
}

相关内容

  • 没有找到相关文章

最新更新