0

我使用 VS 2012 创建了一个 Web API。我有一个带有自定义对象参数的方法,我通过 Fiddler 将 JSON 传递给它进行测试:

[HttpPost, HttpPut] 公共 HttpResponseMessage UpsertProject(Projects p) { ... }

我的 Projects 对象有大约十几个标记为 JsonIgnore 的属性。我的假设是,当我的对象被序列化为 Json 时,这些属性将被忽略......这是真的。但是,当我调试我的方法时,我注意到所有标有 JsonIgnore 的对象属性都设置为 null,即使我从 Fiddler 传入的 Json 正在设置它们。我还尝试将数据作为 Json 获取并将其反序列化为对象的新实例,但这也不会设置标记为 JsonIngore 的属性。我知道 JsonIgnore 可以用于序列化,但认为它不会阻止在反序列化时设置属性。令人沮丧的是,我知道 ScriptIgnore 的行为并非如此,但我想使用 JSON.net 来处理我的序列化/反序列化。我' 我还创建了一个 Windows 应用程序并测试了相同的序列化/反序列化功能,并且它可以在其中工作。所以我想知道这是否是 JsonIgnore 属性的 Web API 限制?

4

1 回答 1

0

如果它在 Windows 应用程序中以您想要的方式工作,但在 Web API 中却没有,这告诉我 JSON 序列化程序设置在两者之间是不同的。您在 Windows 应用程序中使用了哪些设置以使其正常工作?您可以采用这些设置并将它们应用于类Register方法中的 Web API 序列化程序WebApiConfig(在App_Start您的 Web API 项目的文件夹中)。例如:

JsonSerializerSettings jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.NullValueHandling = NullValueHandling.Ignore;
jsonSettings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
...

编辑

好的,所以如果我对您的理解正确,根据您最近的评论,您希望尽可能反序列化所有内容,但您只希望序列化两个特定属性,并且这些属性显然没有空值或默认值。在这种情况下,您可以采取两种方法:

  1. 在序列化之前将不希望序列化的属性设置为 null 或零或 false(默认值)。因为您已DefaultValueHandling设置为Ignore,这将导致这些属性不被序列化。

  2. 在您的类中创建几个布尔ShouldSerializeXXX()方法,其中 XXX 是您不想序列化的每个属性的名称。这些方法应该返回false。有关示例,请参见此问题的第一个答案。

不要使用JsonIgnore,因为如您所见,这将导致 Json.Net 完全忽略该属性,无论是用于序列化还是反序列化。

于 2013-05-02T03:02:16.760 回答