序列化为JSON,尽管指定了NullValueHandling,但使用Json.NET和Web API省略了Nullable Date

using Newtonsoft.Json; namespace FAL.WebAPI2012.Controllers { public class Person { public int Id {get;set;} public string FirstName {get;set;} public string LastName {get;set;} [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, NullValueHandling = NullValueHandling.Include)] public DateTime? Dob { get; set; } } public class TestNullsController : ApiController { // GET api/ public Person Get() { Person myPerson = new Person() { Dob = null, FirstName = "Adrian", Id=1, LastName="Bobby" }; return myPerson; } } } 

如您所见,我的Dob字段设置为null,但结果如下

 { "Id":1, "FirstName":"Adrian", "LastName":"Bobby" } 

Dob没有序列化为null,我需要它!

(我已经测试过JsonProperty正在设置其他属性,比如name,它会完美地改变JSON输出。我只是无法将可空属性序列化。而且,我已经测试了Json.Net(见下面的答案),所以我的想法是网络api设置覆盖某个地方的东西,很高兴知道在哪里)。

似乎问题出在其他地方。 我在控制台应用程序中完成了以下操作:

 using System; using System.IO; using Newtonsoft.Json; namespace JsonNetNullablePropertyTest { class Program { static void Main() { var myPerson = new Person { Dob = null, FirstName = "Adrian", Id = 1, LastName = "Bobby" }; using (var textWriter = new StringWriter()) using (var writer = new JsonTextWriter(textWriter)) { // Create the serializer. var serializer = new JsonSerializer(); // Serialize. serializer.Serialize(writer, myPerson); // Write the output. Console.WriteLine(textWriter); } } } public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, NullValueHandling = NullValueHandling.Include)] public DateTime? Dob { get; set; } } } 

输出是:

 {"Id":1,"FirstName":"Adrian","LastName":"Bobby","Dob":null} 

正如所料。

似乎问题在于你如何实际调用JsonSerializer来序列化Person实例。

我收到了微软web.api民众的回复。

“你会很高兴知道自RC以来已经修复了这个问题:

http://aspnetwebstack.codeplex.com/workitem/243

您可以升级到更新的软件包,也可以覆盖我们的设置,如下所示:

JsonFormatter.SerializerSettings = new JsonSerializerSettings(){NullValueHandling = NullValueHandling.Include};

希望有所帮助’

所以,所有工作都与该更新有关。