在控制器级别设置 NullValueHandling



目前部分,我想从我的 api 响应中排除空值,所以在我的 startup.cs 文件中,我有这个。

services.AddMvc()
    .AddJsonOptions(options =>
    {
        // Setup json serializer
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
    });

但是是否可以声明在一个或多个控制器上,我实际上想包含 NULL 值?

一种选择是创建自定义 JSON 结果类型,如以下问题中所述:在 ASP.NET MVC 3 中使用 JSON.NET 作为默认 JSON 序列化程序 - 可能吗?然后你可以在基本控制器上拥有 bool var,并在使用自定义结果甚至直接传递选项时使用它来禁用 null Json

return Json(data, ignoreNulls: true); 
您可以从

控制器代码内部的BindingContext.OutputFormatters获取JsonOutputFormatter。它允许您动态更改SerializerSettings

尝试在控制器代码中包含using Newtonsoft.Json;,并在控制器操作中执行以下操作:

var f = BindingContext.OutputFormatters.FirstOrDefault(
            formatter => formatter.GetType() ==
                         typeof (Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter))
        as Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter;
if (f != null) {
    //f.SerializerSettings.Formatting = Formatting.Indented;
    f.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
}

我只为我的测试包括Formatting = Formatting.Indented,因为人们会立即看到结果。你不需要它的原因。

更新:我使用没有身份验证的 MVC Web 应用程序创建了演示项目。然后我HomeController添加了以下 metod

public object TestMethod()
{
    var testResult = new {
                         name = "Test",
                         value = 123,
                         nullableProperty = (string) null
                     };
    return testResult;
}

并将项目的启动 URL 更改为 Home/TestMethod 并开始演示。我可以看到

{"name":"Test","value":123,"nullableProperty":null}

您无需添加任何其他 using 语句即可使用我最初发布的代码(只需要具有标准的 using Microsoft.AspNet.Mvc;using System.Linq; (,但是如果您有 using Microsoft.AspNet.Mvc.Formatters;using Newtonsoft.Json;,代码可能会更具可读性。我添加了用于Microsoft.AspNet.Mvc.FormattersNewtonsoft.Json的 using 语句,并将代码修改为以下内容

public object TestMethod()
{
    var testResult = new {
                         name = "Test",
                         value = 123,
                         nullableProperty = (string) null
                     };
    var f = BindingContext.OutputFormatters.FirstOrDefault(
                formatter => formatter.GetType() == typeof (JsonOutputFormatter)) as JsonOutputFormatter;
    if (f != null) {
        f.SerializerSettings.Formatting = Formatting.Indented;
        f.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
    }
    return testResult;
}

输出结果现在如下所示

{
  "name": "Test",
  "value": 123
}

标准代码使用 6.0.6 版中的"Newtonsoft.Json"。我们可以在依赖项中添加"Newtonsoft.Json": "8.0.2"以使用最新版本的Newtonsoft.Json 。请参阅我在问题中报告并且仍然打开的解决间接依赖项的问题。

您可以从此处下载测试项目。

相关内容

  • 没有找到相关文章

最新更新