You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#属性Getter/Setter与默认值的冲突问题求助

解决C#中JSON反序列化int类型默认值与正常赋值的冲突问题

方案一:使用可空int类型封装属性

将属性改为可空int类型,通过私有字段或表达式体属性处理默认值,既允许前端传入null/空串时自动使用默认值0,又能正常接收合法数值:

public class submitRequest
{
    private int? _students;

    public int students
    {
        get => _students ?? 0; // 为空时返回默认值0
        set => _students = value; // 正常接收赋值
    }
}

这种方式属于局部处理,只针对当前类的students属性生效,无需修改全局配置。

方案二:全局配置JSON序列化规则(System.Text.Json)

如果项目中多个类都有类似需求,可以通过全局配置自定义int类型的JSON转换器,统一处理空值或非法字符串的转换:

  1. 首先定义自定义转换器:
public class IntDefaultConverter : JsonConverter<int>
{
    public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 处理null、空字符串或无法转换为int的情况
        if (reader.TokenType == JsonTokenType.Null 
            || (reader.TokenType == JsonTokenType.String && string.IsNullOrWhiteSpace(reader.GetString())))
        {
            return 0;
        }

        // 尝试解析数值,失败则返回默认值0
        return reader.TryGetInt32(out int result) ? result : 0;
    }

    public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value);
    }
}
  1. 在ASP.NET Core的配置中注册该转换器:
// Program.cs 或 Startup.cs
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new IntDefaultConverter());
        // 可选:允许从字符串读取数值(比如前端传"123"也能转为int)
        options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
    });

这种方式会对所有int类型的属性生效,适合全局统一规范。

方案三:使用可空int属性配合映射

如果不想修改原有属性的类型,可以新增一个可空的辅助属性,在业务逻辑中做映射:

public class submitRequest
{
    public int? StudentsInput { get; set; }
    public int students => StudentsInput ?? 0;
}

前端请求时对应StudentsInput字段,业务中直接使用students即可获取带默认值的结果。

内容的提问来源于stack exchange,提问作者farahm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:08:18