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
没有序列化为我需要的空!
(我已经测试过JsonProperty
正在设置其他属性,例如名称,并且它完美地更改了 JSON 输出。我只是无法将可为空的属性序列化。另外,我已经测试了 Json.Net(见下面的答案(,所以我的想法是 Web 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 成员的回复 Microsoft.
'你会很高兴知道自从RC以来这个问题已经修复了:
http://aspnetwebstack.codeplex.com/workitem/243
您可以升级到较新的软件包,也可以覆盖我们的设置,如下所示:
JsonFormatter.SerializerSettings = new JsonSerializerSettings(( { NullValueHandling = NullValueHandling.Include };
希望对您有所帮助">
因此,所有这些都适用于该更新。