【问题标题】:Serializing to JSON, Nullable Date gets omitted using Json.NET and Web API despite specifying NullValueHandling序列化为 JSON,尽管指定了 NullValueHandling,但使用 Json.NET 和 Web API 忽略可空日期
【发布时间】:2012-07-15 15:45:06
【问题描述】:
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;
        }
    }
}

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

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

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

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

【问题讨论】:

    标签: c# .net serialization json.net asp.net-web-api


    【解决方案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 实例。

    【讨论】:

    • 感谢您的输入,刚刚在控制台应用程序中尝试过此操作并验证了您的结果。我想了很多,这不是 json.net 的问题,而是 web api 设置中的某些东西覆盖了某些东西。我创建了一个新的 webapi 项目,以防万一我覆盖了某些内容,因此输入了与我在问题中发布的代码相同的代码 sn-p,但仍然没有 date 属性。所以,我认为 web api 覆盖了一些东西
    • @TwistedInferno 这可能会导致问题“过于本地化”,因为它不涉及 Json.NET,而是另一个代码区域。
    • 我不确定我是否遵循,为了避免关闭,我应该从标签中删除 Json.NET 还是这种类型的问题真的不属于堆栈溢出?
    • @TwistedInferno 该问题属于 Stack Overflow,但如果问题最初是关于 A 并且您发现错误的原因确实是 B,那么问题不是 真的 i> 使用 A,这就是“过于本地化”的定义(这个问题并不是真正由于所述问题引起的,而是一些无关的问题)。
    • 感谢您的信息。我会在某个时候给出它,也许我会重新发布为“web api overriding json.net serializer settings”,并带有一个标签,只是带有 webapi 或类似的东西。
    【解决方案2】:

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

    '您会很高兴知道自 RC 以来此问题已得到修复:

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

    您可以升级到更新的软件包,也可以像这样覆盖我们的设置:

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

    希望有帮助'

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

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多