2012-07-16 37 views
3
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,但结果是以下序列化到JSON,可空日期被使用Json.NET和Web API省略尽管指定NullValueHandling

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

Dob没有序列化为null,我需要它!我测试了JsonProperty正在设置其他属性,如名称,它完全改变了JSON输出,我只是无法获得可空属性被序列化,并且我测试了Json.Net(参见下面的答案)。 ),所以我的想法是,Web API设置重写某处的东西,会很高兴知道在哪里)。

回答

2

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

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

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

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

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

希望可以帮助'

所以,所有的工作与该更新。

3

看来问题出现在别的地方。我已经做了以下的控制台应用程序:

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

+0

感谢您的输入,只是在控制台应用程序中尝试了这一点,并验证了您的结果。我认为,这不是json.net,而是web API的设置中的某些东西,这是压倒一切的。我创建了一个新的webapi项目,以防万一我重写了某些内容,因此输入了与我在问题中发帖相同的代码片段,并且仍然没有日期属性。所以,我认为web api覆盖了一些东西 – orangesherbert 2012-07-16 21:35:04

+0

@TwistedInferno这可能会导致关于这个问题的“过度本地化”关闭,因为它不涉及Json.NET,而是另一个代码区域。 – casperOne 2012-07-16 21:43:20

+0

我不确定我是否遵循,为避免关闭,我应该从标记中删除Json.NET还是这种类型的问题不属于堆栈溢出? – orangesherbert 2012-07-16 22:00:10