我有一个用.NET6开发的API。目前,所有返回为 null 的属性都通过以下方式隐藏:
_ = services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; });
我还需要忽略空字符串的值。我在那里实现了以下转换器:
public class EmptyStringConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return reader.GetString()!;
}
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
if (!string.IsNullOrEmpty(value))
{
writer.WriteStringValue(value);
}
else
{
writer.WriteNullValue();
}
}
}
将转换器添加到
AddJsonOptions
:
_ = services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new EmptyStringConverter());
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
});
转换器正在工作 - 将空字符串属性更改为 null,但在 API 响应中,这些属性是可见的,尽管我已经设置了
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull.
我查看了其他文章,指出添加默认属性,但这意味着必须更改所有模型的所有属性,这是不可行的。此外,这也意味着值为 0 的数字将被隐藏,这不是我想要的。
我需要使用 System.Text.Json 而不是 Newtonsoft。
请问有什么办法可以实现这个目标吗?
您可以自定义DefaultJsonTypeInfoResolver
的JSON合约。
下面的代码将
string
类型的每个属性更改为仅在非 null 且非空时序列化。
通过属性类型检查进行的合同定制仅在每个模型类型中发生一次。
builder.Services
.AddControllers()
.AddJsonOptions(o => o.JsonSerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver()
{
Modifiers = {
jsonTypeInfo =>
{
foreach (var propertyInfo in jsonTypeInfo.Properties.Where(o => o.PropertyType == typeof(string)))
{
propertyInfo.ShouldSerialize = (parent, property) => !string.IsNullOrEmpty(property as string);
}
}
}
});