序列化为 JSON,尽管指定了 NullValueHandling,但仍使用 Json.NET 和 Web API 忽略了可空日期

atr*_*eon 5 .net c# serialization json.net asp.net-web-api

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/<controller>
        public Person Get()
        {
            Person myPerson = new Person() { 
                Dob = null, FirstName = "Adrian", Id=1, LastName="Bobby"
            };

            return myPerson;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

{ "Id":1, "FirstName":"Adrian", "LastName":"Bobby" }
Run Code Online (Sandbox Code Playgroud)

并且Dob没有序列化为我需要的 null !

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

cas*_*One 5

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

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

{"Id":1,"FirstName":"Adrian","LastName":"Bobby","Dob":null}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样。

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


atr*_*eon 2

我收到了来自 Microsoft web.api 人员的回复。

“您会很高兴知道自 RC 以来这个问题已得到解决:

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

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

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

希望有帮助'

所以,一切都适用于该更新。