6

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

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

但我得到的是

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

我发现这个 Q/A WebApi 不会序列化空字段,但答案要么对我不起作用,要么我无法掌握将答案放在哪里。

这是我尝试过的:

  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)]
    

这三个都生成相同的 JSON,但省略了 null 属性。

补充笔记:

  • 在 IIS(也尝试内置)、Windows 7、VS2012 RTM 中本地运行。
  • 控制器方法返回列表——也尝试过 IEnumerable
  • 我试图序列化的对象是 pocos。
4

4 回答 4

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
};
于 2012-08-17T08:05:57.477 回答
2

由于某些奇怪的原因,Newtonsoft.Json.JsonFormatter 忽略了对属性 os SerializerSettings 的分配。

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

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

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

        };
于 2014-12-02T19:40:29.473 回答
1

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

虽然我已经安装了 VS2012 RTM,但我的项目仍在使用 beta 附带的所有 nuget 包。因此,我对所有内容进行了更新(nugot?),现在一切都很好(使用我的问题中的#1)。虽然我觉得烧了半天很傻。

于 2012-08-17T13:07:24.090 回答
0

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

于 2014-08-26T13:40:09.780 回答