序列化到JSON,可空日期被使用Json.NET和Web API尽管指定NullValueHandl

2019-09-19 13:41发布

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;
        }
    }
}

正如你所看到的,我的杜伯字段设置为null,但结果是以下

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

Dob不是序列为空,我需要它!

(我已经测试了JsonProperty被设置其他属性,如姓名,并将其完美地改变了JSON输出。我只是不能为null的属性被序列化。而且,我已经测试Json.Net(见下面的答案),所以我的想法就是Web API建立在某处覆盖的东西,会很高兴地知道在哪里)。

Answer 1:

这样看来,问题出在别处。 我做了一个控制台应用程序如下:

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的实例。



Answer 2:

我从微软web.api民间的成员接受这个答复。

“你会很高兴知道,因为RC这已得到修复:

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

您可以升级到更新包,或者您也可以覆盖我们这样设置:

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

希望帮助

因此,所有的作品与更新。



文章来源: Serializing to JSON, Nullable Date gets omitted using Json.NET and Web API despite specifying NullValueHandling