Asp.net web api Can';t使MVC4 WebApi在JSON中包含空字段

Asp.net web api Can';t使MVC4 WebApi在JSON中包含空字段,asp.net-web-api,json.net,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,但答案要么对我不起作用,要么我不知道该把答案放在哪里 以下是我尝

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

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}]
但我得到的是

[{"Id":1},{"Id":2}]
我找到了这个Q/A,但答案要么对我不起作用,要么我不知道该把答案放在哪里

以下是我尝试过的:

  • 在Global.asax.cs的应用程序_Start中,我添加了:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
    
    这并没有(似乎)错误,而且看起来实际上是基于我尝试的下一件事情而执行的

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

    我之所以说执行#1,是因为#2中的两个值都是在我通过这些行之前设置的

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

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include,
        NullValueHandling = NullValueHandling.Include)]
    
  • 这三种方法都生成相同的JSON,省略了null属性

    补充说明:

    • 在IIS(也尝试内置)、Windows 7、VS2012 RTM中本地运行
    • 控制器方法返回列表--也尝试了IEnumerable
    • 我试图序列化的对象是POCO
    这不起作用:

    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
    };
    

    我最终遇到了这个问题,它描述了我在RTM测试版中遇到的一个bug


    虽然我已经安装了VS2012 RTM,但我的项目仍然使用测试版附带的所有nuget软件包。所以我用NuGet(NuGet?)更新了所有东西,现在一切都好了(使用我问题中的#1)。虽然我觉得烧了半天的火很傻。

    当我看到这个答案时,我很沮丧,因为我已经这么做了,但我的问题仍然存在。我的问题源于这样一个事实,即我的对象实现了一个包含可空类型的接口,因此,我有一个合同,规定如果要实现我,必须拥有其中一个,并且一个序列化程序说如果其中一个为空,则不包括它。轰

    出于某种奇怪的原因,Newtonsoft.Json.JsonFormatter忽略了对propreties os SerializerSettings的分配

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

    config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
            {
    
                DefaultValueHandling =   Newtonsoft.Json.DefaultValueHandling.Include,
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,
    
            };
    

    结果证明它确实有效——或者应该有效。我将发布我所做的一切,以给自己一个完整的谦虚:)第一个变体也可以工作(不创建新的序列化程序设置实例),只要您将DefaultValueHandling和NullValueHandling都设置为各自的Include值这也可以工作,而不创建新的序列化程序设置实例,只要您将DefaultValueHandling和NullValueHandling都设置为各自的Include Values,就需要启动序列化程序设置的新实例来解决开发和登台计算机上的此问题。这是一个令人沮丧的问题,因为我们的开发机器通过简单地设置相应的值(使用看似相同的.NET、json序列化程序版本)就能按预期工作
    config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
            {
    
                DefaultValueHandling =   Newtonsoft.Json.DefaultValueHandling.Include,
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,
    
            };