无法使MVC4 WebApi包含JSON中的空字段

时间:2012-08-17 02:51:20

标签: asp.net-web-api json.net

我正在尝试使用MVC4 WebAPI将对象序列化为JSON(RTM - 今天刚刚安装了VS2012 RTM但昨天在RC中遇到了这个问题)并且我希望在JSON输出中呈现所有空值。 像这样:

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}]

但我得到的是

[{"Id":1},{"Id":2}]

我发现这个Q / A WebApi doesnt serialize null fields,但答案要么对我不起作用,要么我没有把握答案在哪里。

这是我尝试过的:

  1. 在Global.asax.cs的Application_Start中,我补充说:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
    

    这似乎没有(似乎)错误,似乎实际上是根据我尝试的下一件事来执行的。

  2. 在控制器方法中(在ApiController的子类中),添加了:

    base.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
    base.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
    

    我说#1已执行,因为#2中的两个值都已经在我走过的那些线路运行之前已经设置好了。

  3. 在一个绝望的移动中(因为我真的不想装饰每个对象的每个属性)我尝试将此属性添加到一个空且不存在的属性中:

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include,
        NullValueHandling = NullValueHandling.Include)]
    
  4. 所有三个都生成相同的JSON,省略了null属性。

    附加说明:

    • 在IIS中本地运行(也是内置的),Windows 7,VS2012 RTM。
    • 控制器方法返回List - 尝试了IEnumerable
    • 我正在尝试序列化的对象是pocos。

4 个答案:

答案 0 :(得分:10)

这不起作用:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;

但这样做:

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() 
{ 
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include
};

答案 1 :(得分:2)

由于一些奇怪的原因,Newtonsoft.Json.JsonFormatter忽略了对序列化器设置的属性的分配。

为了使您的设置工作,请创建.SerializerSettings的新实例,如下所示:

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
        {

            DefaultValueHandling =   Newtonsoft.Json.DefaultValueHandling.Include,
            NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,

        };

答案 2 :(得分:1)

我终于遇到了这个http://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+despite+specifying+NullValueHandling,它描述了我在测试版中为修复后的错误所带来的错误。

虽然我安装了VS2012 RTM,但我的项目仍在使用测试版附带的所有nuget软件包。所以我为所有事情都进行了(nugot?)更新,现在一切都很好(使用我问题中的#1)。虽然我感到愚蠢,因为我已经烧了半天。

答案 3 :(得分:0)

当我看到这个答案时,我感到很沮丧,因为我已经这样做,但我的问题仍然存在。我的问题根源于我的对象实现了一个包含可空类型的接口这一事实,所以,我有一份合同,说明你是否要实现我必须拥有其中一个,并且一个序列化器说明其中一个是否为null不要包括它。 BOOM!