JSON.NET JsonIgnore DeserializeObject

时间:2013-04-30 19:12:28

标签: api serialization json.net ignore

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

修改

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

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

  2. 在您的类中创建几个布尔ShouldSerializeXXX()方法,其中XXX是您不希望序列化的每个属性的名称。这些方法应返回false。请参阅this question的第一个答案。

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