如何忽略 API JSON 响应中的空字符串?

问题描述 投票:0回答:1

我有一个用.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。

请问有什么办法可以实现这个目标吗?

c# json .net-6.0 jsonserializer
1个回答
0
投票

您可以自定义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);
                }
            }
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.