.NET Core 3.1中JsonConvert.DeserializeObject的MaxLength属性不生效问题
问题根因
[Required]、[MaxLength]属于System.ComponentModel.DataAnnotations命名空间下的数据校验特性,仅会在ASP.NET Core自带的模型绑定流程中自动触发。你手动调用JsonConvert.DeserializeObject反序列化时,Newtonsoft.Json默认不会解析执行这类校验注解,因此规则不会生效。
解决方案
方案1:反序列化后手动执行校验
调用.NET内置的Validator工具类主动触发校验,代码示例:
// 原有反序列化逻辑保持不变 var model = JsonConvert.DeserializeObject<MyModel>(requestBody); // 手动执行校验逻辑 var validationContext = new ValidationContext(model); var validationResults = new List<ValidationResult>(); // 第四个参数需设为true,才会校验所有属性的注解规则 bool isValid = Validator.TryValidateObject(model, validationContext, validationResults, validateAllProperties: true); if (!isValid) { // 校验失败后的处理逻辑:可返回错误、抛出异常等 var errors = validationResults.Select(r => r.ErrorMessage); throw new ValidationException(string.Join(" | ", errors)); }
方案2:使用ASP.NET Core原生模型绑定(推荐)
如果是在ASP.NET Core接口场景中处理请求,无需手动读取请求体反序列化,直接在Action参数中声明模型即可,框架会自动完成反序列化+校验:
[HttpPost] public IActionResult YourApi([FromBody] MyModel model) { // 直接读取ModelState判断校验结果 if (!ModelState.IsValid) { return BadRequest(ModelState); } // 执行业务逻辑 }
该方案是官方推荐的请求参数处理方式,无需额外编写反序列化和校验代码,性能和可维护性更高。
内容的提问来源于stack exchange,提问作者arunraj770
相关产品推荐
相关产品推荐

