.NET Core:从 API JSON 响应中删除空字段
.NET Core: Remove null fields from API JSON response
在 .NET Core 1.0 的全局级别(所有 API 响应),我如何配置 Startup.cs 以便空字段在 JSON 响应中为 removed/ignored ?
使用 Newtonsoft.Json,您可以将以下属性应用于 属性,但我想避免将其添加到每个属性:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string FieldName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string OtherName { get; set; }
.NET 核心 1.0
在Startup.cs
中,您可以将JsonOptions
附加到服务集合并设置各种配置,包括删除空值,其中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings
.NullValueHandling = NullValueHandling.Ignore;
});
}
.NET 核心 3.1
代替这一行:
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
使用:
options.JsonSerializerOptions.IgnoreNullValues = true;
.NET 5.0
代替上面的两种变体,使用:
options.JsonSerializerOptions.DefaultIgnoreCondition
= JsonIgnoreCondition.WhenWritingNull;
.NET Core 3.1 的变体仍然有效,但它被标记为 NonBrowsable
(因此您永远不会得到关于此参数的 IntelliSense 提示),因此它很可能会被废弃在某个时候。
如果您不想修改全局行为,也可以针对每个控制器完成此操作:
public IActionResult GetSomething()
{
var myObject = GetMyObject();
return new JsonResult(myObject, new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore
});
};
以下适用于 .NET Core 3.0,在 Startup.cs > ConfigureServices():
services.AddMvc()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.IgnoreNullValues = true;
});
下面的代码适用于 .Net core 2.2
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
我发现对于 dotnet core 3 这解决了它 -
services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.IgnoreNullValues = true;
});
在Asp.Net核心你也可以在action方法中做,通过返回
return new JsonResult(result, new JsonSerializerOptions
{
IgnoreNullValues = true,
});
在net 5
中其实是DefaultIgnoreCondition
:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.DefaultIgnoreCondition =
System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
});
}
这将防止任何 null 值的序列化和反序列化,而不需要属性上的任何额外属性。
我在我的 .net 核心 v3.1 MVC 中使用了以下内容 api。
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
});
.Net 核心 6 最小 API:
using Microsoft.AspNetCore.Http.Json;
builder.Services.Configure<JsonOptions>(options =>
options.SerializerOptions.DefaultIgnoreCondition
= JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull);
在 .Net 5 及更高版本中,如果您使用 AddNewtonsoftJson 而不是 AddJsonOptions,则设置如下
services.AddMvc(options =>
{
//any other settings
})
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
如果您想将此应用到特定属性并且只使用 System.Text.Json 那么您可以像这样装饰属性
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Market { get; set; }
.Net 6 中的另一种方法,用于特定的 ObjectResult:
public class IdentityErrorResult : BadRequestObjectResult
{
public IdentityErrorResult([ActionResultObjectValue] object? error) : base(error)
{
Formatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
}));
}
}
在控制器中:
public IdentityErrorResult IdentityError(ErrorResponseObject value)
=> new IdentityErrorResult(value);
在 .NET Core 1.0 的全局级别(所有 API 响应),我如何配置 Startup.cs 以便空字段在 JSON 响应中为 removed/ignored ?
使用 Newtonsoft.Json,您可以将以下属性应用于 属性,但我想避免将其添加到每个属性:
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string FieldName { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string OtherName { get; set; }
.NET 核心 1.0
在Startup.cs
中,您可以将JsonOptions
附加到服务集合并设置各种配置,包括删除空值,其中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings
.NullValueHandling = NullValueHandling.Ignore;
});
}
.NET 核心 3.1
代替这一行:
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
使用:
options.JsonSerializerOptions.IgnoreNullValues = true;
.NET 5.0
代替上面的两种变体,使用:
options.JsonSerializerOptions.DefaultIgnoreCondition
= JsonIgnoreCondition.WhenWritingNull;
.NET Core 3.1 的变体仍然有效,但它被标记为 NonBrowsable
(因此您永远不会得到关于此参数的 IntelliSense 提示),因此它很可能会被废弃在某个时候。
如果您不想修改全局行为,也可以针对每个控制器完成此操作:
public IActionResult GetSomething()
{
var myObject = GetMyObject();
return new JsonResult(myObject, new JsonSerializerSettings()
{
NullValueHandling = NullValueHandling.Ignore
});
};
以下适用于 .NET Core 3.0,在 Startup.cs > ConfigureServices():
services.AddMvc()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.IgnoreNullValues = true;
});
下面的代码适用于 .Net core 2.2
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
我发现对于 dotnet core 3 这解决了它 -
services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.IgnoreNullValues = true;
});
在Asp.Net核心你也可以在action方法中做,通过返回
return new JsonResult(result, new JsonSerializerOptions
{
IgnoreNullValues = true,
});
在net 5
中其实是DefaultIgnoreCondition
:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.DefaultIgnoreCondition =
System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
});
}
这将防止任何 null 值的序列化和反序列化,而不需要属性上的任何额外属性。
我在我的 .net 核心 v3.1 MVC 中使用了以下内容 api。
services.AddMvc().AddJsonOptions(options =>
{
options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull;
});
.Net 核心 6 最小 API:
using Microsoft.AspNetCore.Http.Json;
builder.Services.Configure<JsonOptions>(options =>
options.SerializerOptions.DefaultIgnoreCondition
= JsonIgnoreCondition.WhenWritingDefault | JsonIgnoreCondition.WhenWritingNull);
在 .Net 5 及更高版本中,如果您使用 AddNewtonsoftJson 而不是 AddJsonOptions,则设置如下
services.AddMvc(options =>
{
//any other settings
})
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
如果您想将此应用到特定属性并且只使用 System.Text.Json 那么您可以像这样装饰属性
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Market { get; set; }
.Net 6 中的另一种方法,用于特定的 ObjectResult:
public class IdentityErrorResult : BadRequestObjectResult
{
public IdentityErrorResult([ActionResultObjectValue] object? error) : base(error)
{
Formatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
}));
}
}
在控制器中:
public IdentityErrorResult IdentityError(ErrorResponseObject value)
=> new IdentityErrorResult(value);