我使用VS 2012创建了一个Web API。我有一个自定义对象参数的方法,我通过Fiddler传递JSON进行测试:
[HttpPost HttpPut]公共HttpResponseMessage UpsertProject(项目p){…}
我的项目对象有大约十几个属性标记为JsonIgnore。我的假设是,当我的对象被序列化成Json时,这些属性将被忽略…这是真的。然而,当我调试我的方法时,我注意到所有用JsonIgnore标记的对象属性都被设置为空,即使我从Fiddler传入的Json正在设置它们。我还尝试将数据作为Json并将其反序列化到对象的新实例中,但这也不设置标记为JsonIngore的属性。我知道JsonIgnore可以用于序列化,但没想到它会阻止反序列化时设置属性。令人沮丧的是,我知道ScriptIgnore不这样做,但我想使用JSON.net来处理我的序列化/反序列化。我还创建了一个windows应用程序,并测试了相同的序列化/反序列化功能,它在其中工作。所以我想知道如果这是一个Web API限制与JsonIgnore属性?
如果它在Windows应用程序中以您想要的方式工作,但在Web API中不是,这告诉我JSON序列化器设置在两者之间是不同的。你在Windows应用程序中使用了哪些设置才能使其工作?您可以将这些设置应用于WebApiConfig
类的Register
方法中的Web API序列化器(在您的Web API项目的App_Start
文件夹中)。例如:
JsonSerializerSettings jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.NullValueHandling = NullValueHandling.Ignore;
jsonSettings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
...
编辑
好吧,如果我理解正确的话,根据你最近的评论,你希望一切都被反序列化,如果可能的话,但你只希望两个特定的属性被序列化,这些显然没有空值或默认值。在这种情况下,您可以采用两种方法:
在序列化之前将不希望序列化的属性设置为null或0或false(默认值)。因为您将
DefaultValueHandling
设置为Ignore
,这将导致这些属性不被序列化。在你的类中创建几个布尔
ShouldSerializeXXX()
方法,其中XXX是你不想序列化的每个属性的名称。这些方法应该返回false
。
不要使用JsonIgnore
,因为正如您所看到的,这将导致Json完全忽略该属性。