13

我正在开发一个 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

根据我所做的搜索,这似乎是JSON.NET 的 IgnoreSerializableAttribute 设置的问题,要解决我的问题,我只需要按照文章的建议在全局范围内设置它。如何在 ASP.NET Web api 项目中全局更改此设置?

4

4 回答 4

37

我找到了摆脱名称中的 k__BackingField 的简单方法。

这个片段应该在 Global.asax.cs 的 Application_Start() 中的某个地方:

JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;

看起来默认设置会处理它。

于 2012-07-10T20:33:24.140 回答
2

DefaultContractResolver由于该库没有为JsonConvert.

在您的静态包装器中,您可以定义一个静态合同解析器:

private static readonly DefaultContractResolver Resolver = new DefaultContractResolver
{
    IgnoreSerializableAttribute = true
};

您可以将其传递给JsonSerializerSettings包装器内的 , 中的每个序列化方法。然后你在整个项目中给你的班级打电话。

另一种方法是获取 JSON.NET 源代码并自行调整以默认使用该属性。

于 2012-06-20T18:20:03.353 回答
0

对我来说,以下解决了循环引用和k__BackingField.

在您WebApiConfig的方法中添加以下内容Register()

JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings {

    ContractResolver = new DefaultContractResolver {
        IgnoreSerializableAttribute = true
    },
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;
于 2018-09-13T14:22:46.463 回答
-2

朋友,不要这样声明属性:

public String DiscretionCode { get; set; } 

但是,创建辅助变量,如旧......

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}
于 2016-02-11T12:42:09.607 回答