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转换器,统一处理空值或非法字符串的转换:
- 首先定义自定义转换器:
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); } }
- 在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
相关产品推荐
相关产品推荐

