目前部分,我想从我的 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.Formatters
和Newtonsoft.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
。请参阅我在问题中报告并且仍然打开的解决间接依赖项的问题。
您可以从此处下载测试项目。